Страница 2 из 2

Добавлено: 29 окт 2004, 17:34
Eugie
Нет, ни в коем случае!

FreeOnTerminate:= True надо добавить в TMyThread.Create(). Это просто приводит к автоматическому вызову TMyThread.Free() по завершении Execute().

Добавлено: 29 окт 2004, 18:54
UUU
Конечно, просто день рождения сегодня :-)

Добавлено: 21 янв 2005, 09:12
UUU
Вернемся к нашим баранам :-)
И так имеем:

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


    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 действует и на вложенные процедуры.

Добавлено: 19 окт 2006, 17:05
Лелик_1044
Как правильно разрушить поток в процедуре
Execute т.е. послевыполнения сам себя

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

у меня по f7 он в destroy по циклу бегает

Добавлено: 20 окт 2006, 12:16
Лелик_1044
Что-то намудрил
Как проверить сколько потоков запустила программа и сколько потоков в данный момент работает, на паузе

Добавлено: 23 окт 2006, 16:02
UUU
я, когда решал такую задачу - не смог ее решить красиво. Сделал тупо.
например, у меня максимальное количество потоков 20.
Запуская поток, увеличиваю счетчик, при закрытии его - уменьшаю. Работает безотказно уже 2 года :-)
Ни разу не встречался с зацикливанием. Везде стоят трай экзепт :-)

Добавлено: 23 окт 2006, 18:33
Лелик_1044
Мне надо сделать
1)Запускаю Н потоков они делают работу потом сами себя разрушают
2)Если нажимаю кнопку стоп независимо сделали до конца потоки свою работу их надо разрушить
3)Если нажимаю нопку пауза все потоки которые не доделали работу поставить на паузу
4)если нажимаю кнопку пуск после паузы то не надо создавть новые потоки надо просто чтоб старые доделали свобработу

Добавлено: 24 окт 2006, 09:10
LAngel

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

{
 Остановка всех нитей процесса.
 Если останавливается текущий процесс, то вызывающая нить не останавливается.
}
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

Добавлено: 24 окт 2006, 11:04
Лелик_1044
LAngel,
Т.е мне надо будет бросить номер того процесса которыйц я хочу остановить?
Да и при остоновлении он разрушается или на паузу ставится

Добавлено: 24 окт 2006, 16:19
LAngel
Лелик, останавливается (на паузу)
если передавать GetCurrentProcessID тогда текущая нить (вызвавшая процедуру остановки) не замораживается.