Главная страница
    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
1-1152515177
Stanislav
2006-07-10 11:06
2006.08.20
Запуск службы от имени пользователя


2-1152795368
TForm
2006-07-13 16:56
2006.08.20
Показ форм


1-1152169596
RDS
2006-07-06 11:06
2006.08.20
Кнопка приложения на панели задач


9-1132981739
rtyrt
2005-11-26 08:08
2006.08.20
Как определить поддерживается ли OpenGL аппаратно или нет?


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