Главная страница
    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.038 c
15-1153308556
ZeFiR
2006-07-19 15:29
2006.08.20
Винда


6-1144007969
Vovanchik
2006-04-02 23:59
2006.08.20
Обработка ошибок в TClientSocket;,TServerSocket


15-1153462144
Ega23
2006-07-21 10:09
2006.08.20
С Днём рождения! 21 июля


2-1154136447
Батя
2006-07-29 05:27
2006.08.20
E-mail


1-1152270701
Dok
2006-07-07 15:11
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский