Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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;

Все равно не защитил главный поток от дочерних :(
Только 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.04 c
2-1154032666
susergey
2006-07-28 00:37
2006.08.20
ShellExecute


2-1154417827
elysee
2006-08-01 11:37
2006.08.20
Запрос


15-1153644917
Рырыры
2006-07-23 12:55
2006.08.20
Медным тазом ...:(


2-1154521483
Id
2006-08-02 16:24
2006.08.20
Функции в Delphi


15-1153327198
Sergey Masloff
2006-07-19 20:39
2006.08.20
Ситуация с винами - вот где беспредел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский