Форум: "WinAPI";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизУбийство потока через сообщение Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c