Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

Синхронизация потоков   Найти похожие ветки 

 
Николас   (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;

Все равно не защитил главный поток от дочерних :(
Только synchronize

procedure 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
15-1153421716
Vendict
2006-07-20 22:55
2006.08.20
Клиент


15-1153754078
VirEx
2006-07-24 19:14
2006.08.20
уже пора в СПБ?


1-1151967710
MNC
2006-07-04 03:01
2006.08.20
фокус на первый символ в РичЕдит


3-1150200676
bon
2006-06-13 16:11
2006.08.20
id @ parent


2-1154011575
Footballer
2006-07-27 18:46
2006.08.20
Как с помощью Delphi узнать номер процессора на компе?