Страница 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 тогда текущая нить (вызвавшая процедуру остановки) не замораживается.