
В общем сам запутался в край. Прошу подтолкнуть.
В схеме все подписал через LH.
code_32873.txt
Ответов: 704
Рейтинг: 7
|
|||
Когда-то поднимал я тему на счет потоков и ошибок. Индиго мне ткнул носом в мютексы. И все вроде заработало. Пока не сменил компьютер на более шустрый. Тут опять вылезли накладки с потоками. Потому прошу знающих подсказать в этой алгоритмической схеме как правильно поставить мютексы и может где-то нужно потоки заменить чем-то... Может алгоритм неверный в корне. Читал в википедии что вроде мютексы нельзя ставить на 2 разных потока ибо будет самоблокировка и "гонка" и треш и хоррор
![]() В общем сам запутался в край. Прошу подтолкнуть. В схеме все подписал через LH. code_32873.txt |
|||
карма: 0 |
| ||
файлы: 1 | code_32873.txt [1.8KB] [199] |
Разработчик
Ответов: 26304
Рейтинг: 2146
|
|||
Neo, между прочим, к SQLite применять потоки крайне нежелательно, тк SQLite сам использует потоки и у него есть своя собственная очередь запросов. В твоей схеме надо использовать синхронизацию по doSynchExec.
Как-то вот так
|
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
nesco, спасибо. Пока не додумался рассмотреть такой вариант, так как пугает возможность, что когда-то может получится сразу штук 5 результатов за один запрос из БД, и тут мемори не справится. А если поставлю накопление результатов вместо мемори, то ведь будут подвисания основного потока? Мютексы вообще не нужны здесь?
И вдруг основной поток быстрее сделает свою работу, а doSynchExec возьмет данные, которые БД еще пишет своим потоком в мемори? Или это невозможно? Что-то в потоках плаваю... А экспериментально слишком долго приходится ждать вылезет накладка или нет ![]() ------------ Дoбавленo в 01.38: И ведь основной поток может притормозить так как выводит данные на интерфейс. В этот момент параллельный поток сработает и будет накладка? |
|||
карма: 0 |
|
Разработчик
Ответов: 26304
Рейтинг: 2146
|
|||
Neo писал(а): а doSynchExec возьмет данные, которые БД еще пишет своим потоком в мемори? Или это невозможно?Нет, это невозможно. Сначала выполнится вся цепть событий, подключенных к точке onExec, и только после этого, поток включит переход на событие onSynchExec, которое тоже сразу не сработает, а только тогда, когда это событие попадет в обработку очереди главного потока Neo писал(а): В этот момент параллельный поток сработает и будет накладка?Не будет, поток запишет данные в Memory, а вот прочитает их только тогда, когда главный поток разрешит выполнить событие onSynchExec ------------ Дoбавленo в 01.53: Neo писал(а): возможность, что когда-то может получится сразу штук 5 результатовДелай буфер и циклично его выбирай до опустения |
|||
карма: 22 |
| ||
Голосовали: | Neo |
Ответов: 704
Рейтинг: 7
|
|||
nesco, А здесь я правильно организовал или есть более красивый метод?
Сложность в том, что некоторые компоненты выдают данные уже в новом потоке и точки синхронизированного события у них нет. code_32908.txt |
|||
карма: 0 |
| ||
файлы: 1 | code_32908.txt [1.1KB] [210] |
Ответов: 4663
Рейтинг: 767
|
|||
Neo писал(а): точки синхронизированного события у них нетNeo, здесь на последней странице я выложил схему с IC, которая показывает вызов синхронного события из любого места потока. Только нужен файл NSThreads.pas из первого поста. |
|||
карма: 26 |
| ||
Голосовали: | Neo |
Ответов: 704
Рейтинг: 7
|
|||
Запутался совсем. Растолкуйте как правильно организовать такой пример:
Пишем в список системным потоком. Но читать и записывать в базу уже нужно только параллельным потоком, и запись может длиться даже когда новые данные уже будут хотеть добавиться в список. А потом произойдет очистка (по синхронизированному событию) и они тоже очистятся, так и не исполнившись? Да и еще я получу ошибку доступа к данным если будет одновременно и запись и чтение? Направьте мою мышку опытной рукой к нужным компонентам ![]()
|
|||
карма: 0 |
|