Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизСинхронизация потоков Найти похожие ветки
← →
Николас (2006-08-01 02:08) [0]Помогите разобраться с проблемой, есть несколько потоков в которых выполняется какие-то действия, в потокал выводятся данные в лог подобным образом:
procedure WriteLog(S:String);
begin
Memo1.Lines.Text := s ;
end;
но при одновременной попытке нескольких потоков записать лог, приложение виснет. Пытался решить эту проблему с помощью критических секций, так:
var
CriticalSection: TCriticalSection ;
...
CriticalSection := TCriticalSection.Create;
...
procedure WriteLog(S:String);
begin
CriticalSection.Enter ;
Memo1.Lines.Text := s ;
CriticalSection.Leave ;
end;
но проблема осталась, приложение зависает. если закомментировать строку "Memo1.Lines.Text := s ;" то все работает нормально, зависаний небыло... Посоветуйте что можно сделать.
← →
Eraser © (2006-08-01 02:17) [1]> [0] Николас (01.08.06 02:08)
> Memo1.Lines.Text := s ;
1. странный способ занасить данные в Log.
2. к VCL объектам нельзя обращаться из доп. потоков. См. в сторону synchronize.
← →
Slym © (2006-08-01 06:16) [2]Николас (01.08.06 2:08)
procedure WriteLog(S:String);
begin
CriticalSection.Enter ;
Memo1.Lines.Text := s ;
CriticalSection.Leave ;
end;
Все равно не защитил главный поток от дочерних :(
Только synchronizeprocedure Thread1.WriteLog(const S:String);
begin
FS:=s;
synchronize(DoWriteLog)
end;
procedure Thread1.DoWriteLog;
begin
Form1.Memo1.Lines.Add(FS);
end;
← →
Николас (2006-08-01 09:25) [3]Спасибо за ответы, про Synchronize знаю, его бы и использовал если бы у меня был TThread :) Но дело в том что потоки запускаются следующим образом:
BeginThread(nil, 0, Addr(Process), nil, 0, tid);
...
function Process(Parameter : Pointer) : Integer;
begin
...
end;
← →
Slym © (2006-08-01 09:28) [4]SendMessage ?
← →
Сергей М. © (2006-08-01 09:34) [5]
> Николас (01.08.06 09:25) [3]
const
TM_LOG = WM_USER + 100; //константа 100 выбрана от фонаря
type
TMyForm = class(TForm)
..
procedure MsgThreadLog(var Message: TMessage); message TM_LOG;
..
end;
..
procedure TMyForm.MsgThreadLog(var Message: TMessage);
begin
Mem1.Lines.Add(PChar(Message.wParam));
end;
function Process(Parameter : Pointer) : Integer;
var
s: String;
begin
...
s := "SomeText";
SendMessage(MyForm.Handle, TM_LOG, wParam(PChar(s)), 0);
...
end;
← →
Николас (2006-08-01 09:38) [6]Как я только не догадался :) Спасибо огромное!!! Вечером проверю и скажу результат, думаю прокатит :)
← →
Сергей М. © (2006-08-01 09:43) [7]
> Николас (01.08.06 09:38) [6]
>
> Как я только не догадался
Действительно, и так не догадался и эдак не догадался)
Есть же исх.текст TThread, его и следовало бы в 1-ю очередь посмотреть на предмет как это реализовано у самого Борланда ..
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.045 c