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

Вниз

Убийство потока через сообщение   Найти похожие ветки 

 
Talla2k ©   (2003-11-15 12:30) [0]

Имеется следуюший код :

procedure TForm1.Button1Click(Sender: TObject);
begin
CommThread := CreateThread(nil,0,@POTOK,nil,0,ThreadID); // рождение потока
setthreadpriority(commthread,2);
end;

procedure potok;
var i:integer;
outst:string;
begin

for i:=1 to 50 do begin
form1.bsSkinGauge1.value:=(i*100)div 50;
if READTABLE("R0;"+inttostr(i)+";",outst)=false then begin
exitcomm;
closecomm;
sendmessage(Form1.handle,_mymessage,1,0);
end else form1.Memo1.lines.add(outst);
end;
form1.bsSkinGauge1.value:=0;
exitcomm;
closecomm;
sendmessage(Form1.handle,_mymessage,1,0);
end;

procedure TForm1.MyMessage(var Msg:TMessage);
begin
terminateThread(CommThread,0);
closehandle(CommThread); //убийство потока
end;

Вопрос : правильно ли я убиваю поток?
И еще существует ли способ убийства без использования сообщений???


 
clickmaker ©   (2003-11-15 12:35) [1]

Неправильно

try
for i:=1 to 50 do begin
form1.bsSkinGauge1.value:=(i*100)div 50;
if READTABLE("R0;"+inttostr(i)+";",outst)=false then Exit
else form1.Memo1.lines.add(outst);
end;
form1.bsSkinGauge1.value:=0;
finally
exitcomm;
closecomm;
end;


 
Talla2k ©   (2003-11-15 12:38) [2]

to clickmaker
Я вообще спрашивал про убийство потока!!!
С тем я как-то сам разберусь!


 
Digitman ©   (2003-11-15 13:04) [3]


> правильно ли я убиваю поток?


в принципе - правильно.
но делать это крайне не рекомендуется, ибо это аварийный способ, т.е. способ уничтожить поток, который не завершается в ожидаемые сроки ожидаемым (штатным) образом и не реагирует ни на какие сигналы извне.


> существует ли способ убийства без использования сообщений?


существует.
это способ при помощи сист.объектов синхронизации : мьютексы, ивенты, семафоры и пр.

но чем тебя не устраивают сообщения - непонятно.

теперь - по остальному коду.

поточная ф-ция у тебя объявлена и реализована неверно, правильно будет вот так :

function potok( Param: Pointer): DWord; stdcall;
begin
... //здесь - собственно логика поточной ф-ции
Result := результат; //необязательно
ExitThread(результат);//обязательно ! поток завершает свою работу вызовом этой ф-ции !
end;

в теле поточной ф-ции не допускается прямое обращение к оконным VCL-контролам, работающим с канвой, без синхронизации таких обращений с осн.код.потоком процесса.


 
Talla2k ©   (2003-11-15 13:22) [4]

: to Digitman
Насколько я понял,эта поточная ф-ция приведенная тобой не нуждается в убийстве через сообщение???Или я неправильно понял???

И еще насчет прямого обращения к оконным VCL-контролам работающим с канвой,а как быть???
Мне обязательно необходимо передавать в form1.bsSkinGauge1.value и принимать из StringGrid.Cells.


Может подскажешь где посмотреть исходник по работе с потоком (как ты говориш с СИНХРОНИЗАЦИЕЙ )
Очень НАДО!!!Подскажи пожалуйста!!!!!!


 
Digitman ©   (2003-11-15 13:37) [5]

пример есть в каталоге демо-проектов в составе Делфи : threads.dpr


 
Talla2k ©   (2003-11-15 16:46) [6]

to Digitman
У меня Delphi 5,а пример тот вообще не похож на то о чем мы говорили! Не могли бы Вы выслать пример получше!


 
Digitman ©   (2003-11-16 11:44) [7]


> Talla2k


я и говорю - этот пример как раз в Делфи5, за другие версии не ручаюсь

чем же он не похож ? только тем, что треды там программируются с использованием готового класса TThread, а не прямыми вызовами WinAPI ? И что тебя в этом смущает ? Из всего этого примера важно самое шлавное - логика синхронизации обращений к VCL-контролам из доп.код.потока



Страницы: 1 вся ветка

Текущий архив: 2004.01.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
4-63444
Dima_dvp
2003-11-13 01:05
2004.01.20
А зачем нужны Атомы?


1-63089
andrey__
2003-12-30 13:57
2004.01.20
TServiceApplication


1-63147
Miwa
2004-01-07 07:27
2004.01.20
Сравнение сортированных списков.


1-63231
elic
2004-01-09 14:21
2004.01.20
PopupMenu


4-63445
XoraX
2003-11-13 21:54
2004.01.20
Запись строк в ресурсы файла?