Текущий архив: 2003.10.06;
Скачать: CL | DM;
Вниз
Kak vozmojno ubit potok v kotorom bezkanechni cikl? Найти похожие ветки
← →
Delphi5.01 © (2003-09-21 20:28) [0]Dobroe vrema sutok!
privoju kod
procedure TReadThread.DoWork;
begin
While true do
Application.ProcessMessages;
end;
procedure TReadThread.Execute;
begin
While Not Terminated do
Synchronize(DoWork);
end;
procedure TForm1.Button1Click(Sender: TObject);
var F: TReadThread;
T: Integer;
begin
F:=TReadThread.Create(False);
F.FreeOnTerminate:=True;
T:=GetTickCount;
While GetTickCount-t<100 do
Application.ProcessMessages;
F.Terminate;
end;
Kak vozmojno ubit potok v kotorom bezkanechni cikl?
P.S. v dannom primere programa zaciklivaetsa na cikle
While GetTickCount-t<100 do
Application.ProcessMessages;
ona ne poluchaet novoe znachenie GetTickCount;
vopros ochen slojni
← →
Alex Konshin © (2003-09-22 00:59) [1]Нужно, чтоб сам поток периодически проверял какой-нибудь event, а главная нить в нужный момент его должна выставлять.
Смотри http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/synchronization.asp
Если же поток производит какие-то операции, которые могут зависнуть, например, соединение через интернет, то тогда для запуска этих оперций используй функции, в которых можно указать таймаут, например, для winsock2 практически в любом значительном вызове можно это сделать.
← →
Delphi5.01 © (2003-09-22 06:57) [2]Ia ispolzuiu funksiu Read u TFileSream, no ei ne vozmojno ustanovit taimaut, i po etoi prichine ia i vzal Thread
← →
Alex Konshin © (2003-09-22 08:37) [3]Так кто тебя заставляет использовать TFileStream?
Вызывай ReadFile сам. http://msdn.microsoft.com/library/en-us/fileio/base/readfile.asp
Или еще красивее: создай свой класс-наследник от TFileStream, добавь ему property Timeout и перекрой метод Read (он реализован в THandleStream) так, чтоб он вызывал ReadFile с таймаутом. Это же совсем нетрудно, не так ли?
Я очень не рекомендую бездумно использовать классы и компоненты из VCL при работе с нитями. Помните: VCL писалось без расчета на использования ее в multithread среде. Например, для TFileStream проблем вроде как и не видно, но как видишь, они есть.
← →
Evgeny V © (2003-09-22 08:53) [4]Поток у тебя неверно построен в Execute (да весь код не очень удачно), в чем прелесть твоего потока, если ты синхронизмом отдаешь работу в поток основного окна, мог бы с таким же успехом просто вызвать нужную процедуру или послать PostMessage в главной форме себе же? Убить зависший поток можно TerminateThread, см хелп, но лучше не допускать "зависания" по возможности. используй ожидание сообщений в потоке или событий, что бы поток "уснул", если ему нечего делать. Смотри WaitMessage и PostThreadMessage, PeekMessage или для событий WaitForSingleObject или WaitForMultipleObjectsb и SetEvent и ResetEvent.
← →
Delphi5.01 © (2003-09-23 17:46) [5]To Alex Konshin
idea ochen ponravilas, no vot problema to uma ne smog dovesti, tipa prochital MSDN (kstati on u mena na kompe ustanovlen :-)), no proga daiot 87 oshibku pri ustanovke SetCommTimeouts, v chom delo? A tak Readfile rabotaet na 5.
Time.ReadIntervalTimeout:=10;
Time.ReadTotalTimeoutMultiplier:=10;
Time.ReadTotalTimeoutConstant:=10;
if Not SetCommTimeouts(F.Handle,Time) then
begin
ShowMessage("Cannot set timeout."+IntToStr(GetLastError));
halt;
end;
Spasibo.
← →
pasha_golub © (2003-09-23 18:10) [6]Есть грубый способ TerminateThread, но от него потом чего угодно ждать можно
← →
Delphi5.01 © (2003-09-23 20:51) [7]To [16]
Problema v drugom, potok nevozmojno ubit potomu chto on berot vse resursi na seba i glavnaia proga visnet
To [all]
problema reshaetsa ReadFile-om no ia ne mogu izmenit vrema oprosa, a po umolchaniu ochen bolshoe okolo 60 secun proveraet, i pitaetsa prochest baiti, a ia xochu ustanovit maksimum 5 sekund. dla etogo nado ispolzovat SetCommTimeouts no ia ne smog pravelno ego ispolzovat i po etoi prichine sprashivau kak eto vozmojno sdelat?
Spasibo.
← →
SetCmmmTimeouts (2003-09-24 07:14) [8]Tak kak na schot SetCmmmTimeouts
Страницы: 1 вся ветка
Текущий архив: 2003.10.06;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.02 c