• 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]
    синхронизация нужна если в алго присутствует обращение к "визуальным компонентам"
  • Vladimir Kladov © (15.08.10 21:33) [2]
    Ничего нельзя делать с одним и тем же объектом в разных потоках, не обеспечивая исключительный доступ к объекту на время операции. См. критические секции, семафоры, мьютексы. 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 не вернет результат обработки
Есть новые Нет новых   [134430   +4][b:0][p:0.001]