Потоки в Builder
Решил я сделать чтобы в одном потоке эти строки генерились, а в другом потоке они отдавались на обработку серверу. И во с чем я столкнулся
Обработка одного потока не начинается пока не закончиться работа второго. В чем косяк или это как в анекдоте "подожди сынок, дискетку отформатирую".
Вот пример
w = new load(false); //в этом потоке запускается интерпретатор и сливает строки в ListBox
q = new LOC(false); // в этом потоке, по идеи, проверяеться если listbox не пустой, то забрать строку и сделать сней че нибудь, а после того как забрал удалить
при этом после запуска w основной поток не отвечает пока не завершиться он
а вот если вместо
Synchronize(lp);
написать просто
lp();
то потоки живут одельно от основного
Есть такая программа она сначало генерирует SQL строки а потом пихает их серваку. Действует последовательно
Решил я сделать чтобы в одном потоке эти строки генерились, а в другом потоке они отдавались на обработку серверу. И во с чем я столкнулся
Обработка одного потока не начинается пока не закончиться работа второго. В чем косяк или это как в анекдоте "подожди сынок, дискетку отформатирую".
Вот пример
w = new load(false); //в этом потоке запускается интерпретатор и сливает строки в ListBox
q = new LOC(false); // в этом потоке, по идеи, проверяеться если listbox не пустой, то забрать строку и сделать сней че нибудь, а после того как забрал удалить
при этом после запуска w основной поток не отвечает пока не завершиться он
Обработчики то, все равно, работают в одном потоке, в том, где цикл обработки сообщений. Вот и получается, что вставляешь ты строку в ListBox с помощью SendMessage, и пока обработчик сообщения не отработает (в этом или другом потоке), этот поток ожидает. Аналогично с потоком, который выбирает строки из listBox. Видимо, они мешают друг другу.
Обработчики то, все равно, работают в одном потоке, в том, где цикл обработки сообщений. Вот и получается, что вставляешь ты строку в ListBox с помощью SendMessage, и пока обработчик сообщения не отработает (в этом или другом потоке), этот поток ожидает. Аналогично с потоком, который выбирает строки из listBox. Видимо, они мешают друг другу.
Очень похоже на правду. Я еще обратил внимание, что если торчит While по terminated и прога должна крутиться постоянно, пока юзер че-то не нажмет или пока полностью не проскочит, скажем так - "достаточно длительная обработка", то такая конструкция практически не работоспособна или приоритеты потоков должны быть ниже чем приоритет главной формы (сервиса). Я просто отказался от конструкции
while(!Terminated){Synchronize(..);} если с ней поиграться при нескольких потоках с одинаковыми приоритетами и при этом че-то выводить на экран, то видно, что эти приоритеты фикция, тот кто первым задницей сел, тот и молотит быстрее остальных, а отсюда ИМХО и просчитывать Synchronize надо самому.
Most methods that access a VCL object and update a form must only be called from within the main VCL thread or use a synchronization object such as TMultiReadExclusiveWriteSynchronizer.
P.S. А вообще может быть попробовать вручную их синхронизить? Например, как описано в книге Дейтла...Впрочем все семафоры, мутексы и прочее уже есть в самом билдере...