-
Dy1 (15.08.10 10:27) [0]В потоке:function TForm1.Thread1Execute(Sender: PThread): Integer;
begin
...
WRlog('строка в лог-файл');
procedure TForm1.WRlog(const text: ansistring);
Вопрос: как WRlog выполнить в главном потоке? Как передать записываемую строку?
И если в главном потоке PList только читается, в дополнительном потоке можно писать в список или опять через Synchronize ? -
QAZ (15.08.10 15:59) [1]синхронизация нужна если в алго присутствует обращение к "визуальным компонентам"
-
Ничего нельзя делать с одним и тем же объектом в разных потоках, не обеспечивая исключительный доступ к объекту на время операции. См. критические секции, семафоры, мьютексы. Synchronize в принципе сойдет, если устраивает очень медленная работа, т.к. вызывающий поток вынужден будет дождаться, пока главный поток сможет обработать сообщение cm_execproc.
-
Dy1 (16.08.10 19:55) [3]Извиняюсь, я с потоками на Вы.
А что будет [хорошего/плохого], еслиSendMessage( Applet.fHandle, CM_EXECPROC, 0, Integer( @Self ) );
в Synchronize заменить на PostMessage ? -
QAZ (17.08.10 11:21) [4]PostMessage ставит сообщение в очередь и выходит
SendMessage напрямую шлет сообщение и ждет выполнения
SendMessage можно слать из потока без всяких Synchronize
поток остановиться до тех пор пока сообщение не обработается и SendMessage не вернет результат обработки