Thread прервать по TimeOut
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Нет, ни в коем случае!
FreeOnTerminate:= True надо добавить в TMyThread.Create(). Это просто приводит к автоматическому вызову TMyThread.Free() по завершении Execute().
FreeOnTerminate:= True надо добавить в TMyThread.Create(). Это просто приводит к автоматическому вызову TMyThread.Free() по завершении Execute().
Конечно, просто день рождения сегодня :-)
Вернемся к нашим баранам :-)
И так имеем:
Воипрос в том, что надо ли в TWebThread.Execute прописать try except, для обработки левых ситуаций. Т.к. насколько я понимаю try except действует и на вложенные процедуры.
И так имеем:
Код: Выделить всё
WebThread:=TWebThread.Create(true);
WebThread.FreeOnTerminate:=true;
WebThread.result:=result;
WebThread.Resume;
procedure TWebThread.Execute;
begin
Thread:=1;
Synchronize(ShowStatus);
GrabHTML;
Thread:=-1;
Synchronize(ShowStatus);
end;
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
Как правильно разрушить поток в процедуре
Execute т.е. послевыполнения сам себя
destructor THMAThread.Destroy;
begin
suspend;
free;
Terminate;
// inherited;
end;
у меня по f7 он в destroy по циклу бегает
Execute т.е. послевыполнения сам себя
destructor THMAThread.Destroy;
begin
suspend;
free;
Terminate;
// inherited;
end;
у меня по f7 он в destroy по циклу бегает
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
Что-то намудрил
Как проверить сколько потоков запустила программа и сколько потоков в данный момент работает, на паузе
Как проверить сколько потоков запустила программа и сколько потоков в данный момент работает, на паузе
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
я, когда решал такую задачу - не смог ее решить красиво. Сделал тупо.
например, у меня максимальное количество потоков 20.
Запуская поток, увеличиваю счетчик, при закрытии его - уменьшаю. Работает безотказно уже 2 года :-)
Ни разу не встречался с зацикливанием. Везде стоят трай экзепт :-)
например, у меня максимальное количество потоков 20.
Запуская поток, увеличиваю счетчик, при закрытии его - уменьшаю. Работает безотказно уже 2 года :-)
Ни разу не встречался с зацикливанием. Везде стоят трай экзепт :-)
Реклама запрещена. См. Профиль :-)
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
Мне надо сделать
1)Запускаю Н потоков они делают работу потом сами себя разрушают
2)Если нажимаю кнопку стоп независимо сделали до конца потоки свою работу их надо разрушить
3)Если нажимаю нопку пауза все потоки которые не доделали работу поставить на паузу
4)если нажимаю кнопку пуск после паузы то не надо создавть новые потоки надо просто чтоб старые доделали свобработу
1)Запускаю Н потоков они делают работу потом сами себя разрушают
2)Если нажимаю кнопку стоп независимо сделали до конца потоки свою работу их надо разрушить
3)Если нажимаю нопку пауза все потоки которые не доделали работу поставить на паузу
4)если нажимаю кнопку пуск после паузы то не надо создавть новые потоки надо просто чтоб старые доделали свобработу
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Код: Выделить всё
{
Остановка всех нитей процесса.
Если останавливается текущий процесс, то вызывающая нить не останавливается.
}
Function StopProcess(ProcessId: dword): boolean;
var
Snap: dword;
CurrTh: dword;
ThrHandle: dword;
Thread:TThreadEntry32;
begin
Result := false;
CurrTh := GetCurrentThreadId;
Snap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if Snap <> INVALID_HANDLE_VALUE then
begin
Thread.dwSize := SizeOf(TThreadEntry32);
if Thread32First(Snap, Thread) then
repeat
if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = ProcessId) then
begin
ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
if ThrHandle = 0 then Exit;
SuspendThread(ThrHandle);
CloseHandle(ThrHandle);
end;
until not Thread32Next(Snap, Thread);
CloseHandle(Snap);
Result := true;
end;
end;
{ Запуск процесса остановленного StopProcess }
Function RunProcess(ProcessId: dword): boolean;
var
Snap: dword;
CurrTh: dword;
ThrHandle: dword;
Thread:TThreadEntry32;
begin
Result := false;
CurrTh := GetCurrentThreadId;
Snap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if Snap <> INVALID_HANDLE_VALUE then
begin
Thread.dwSize := SizeOf(TThreadEntry32);
if Thread32First(Snap, Thread) then
repeat
if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = ProcessId) then
begin
ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
if ThrHandle = 0 then Exit;
ResumeThread(ThrHandle);
CloseHandle(ThrHandle);
end;
until not Thread32Next(Snap, Thread);
CloseHandle(Snap);
Result := true;
end;
end;
Coded By Ms-Rem ( Ms-Rem@yandex.ru ) ICQ 286370715
С уважением, Lost Angel...
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
LAngel,
Т.е мне надо будет бросить номер того процесса которыйц я хочу остановить?
Да и при остоновлении он разрушается или на паузу ставится
Т.е мне надо будет бросить номер того процесса которыйц я хочу остановить?
Да и при остоновлении он разрушается или на паузу ставится
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Лелик, останавливается (на паузу)
если передавать GetCurrentProcessID тогда текущая нить (вызвавшая процедуру остановки) не замораживается.
если передавать GetCurrentProcessID тогда текущая нить (вызвавшая процедуру остановки) не замораживается.
С уважением, Lost Angel...