Thread прервать по TimeOut

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

29 окт 2004, 17:34

Нет, ни в коем случае!

FreeOnTerminate:= True надо добавить в TMyThread.Create(). Это просто приводит к автоматическому вызову TMyThread.Free() по завершении Execute().
UUU
Сообщения: 309
Зарегистрирован: 17 фев 2004, 09:27
Откуда: Иваново
Контактная информация:

29 окт 2004, 18:54

Конечно, просто день рождения сегодня :-)
UUU
Сообщения: 309
Зарегистрирован: 17 фев 2004, 09:27
Откуда: Иваново
Контактная информация:

21 янв 2005, 09:12

Вернемся к нашим баранам :-)
И так имеем:

Код: Выделить всё


    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;
Воипрос в том, что надо ли в TWebThread.Execute прописать try except, для обработки левых ситуаций. Т.к. насколько я понимаю try except действует и на вложенные процедуры.
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

19 окт 2006, 17:05

Как правильно разрушить поток в процедуре
Execute т.е. послевыполнения сам себя

destructor THMAThread.Destroy;
begin
suspend;
free;
Terminate;
// inherited;
end;

у меня по f7 он в destroy по циклу бегает
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

20 окт 2006, 12:16

Что-то намудрил
Как проверить сколько потоков запустила программа и сколько потоков в данный момент работает, на паузе
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
UUU
Сообщения: 309
Зарегистрирован: 17 фев 2004, 09:27
Откуда: Иваново
Контактная информация:

23 окт 2006, 16:02

я, когда решал такую задачу - не смог ее решить красиво. Сделал тупо.
например, у меня максимальное количество потоков 20.
Запуская поток, увеличиваю счетчик, при закрытии его - уменьшаю. Работает безотказно уже 2 года :-)
Ни разу не встречался с зацикливанием. Везде стоят трай экзепт :-)
Реклама запрещена. См. Профиль :-)
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

23 окт 2006, 18:33

Мне надо сделать
1)Запускаю Н потоков они делают работу потом сами себя разрушают
2)Если нажимаю кнопку стоп независимо сделали до конца потоки свою работу их надо разрушить
3)Если нажимаю нопку пауза все потоки которые не доделали работу поставить на паузу
4)если нажимаю кнопку пуск после паузы то не надо создавть новые потоки надо просто чтоб старые доделали свобработу
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

24 окт 2006, 09:10

Код: Выделить всё

{
 Остановка всех нитей процесса.
 Если останавливается текущий процесс, то вызывающая нить не останавливается.
}
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;
(c) Advanced API Hook Libary.
Coded By Ms-Rem ( Ms-Rem@yandex.ru ) ICQ 286370715
С уважением, Lost Angel...
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

24 окт 2006, 11:04

LAngel,
Т.е мне надо будет бросить номер того процесса которыйц я хочу остановить?
Да и при остоновлении он разрушается или на паузу ставится
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

24 окт 2006, 16:19

Лелик, останавливается (на паузу)
если передавать GetCurrentProcessID тогда текущая нить (вызвавшая процедуру остановки) не замораживается.
С уважением, Lost Angel...
Ответить