Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.09;
Скачать: CL | DM;

Вниз

Остановить выполнение нити   Найти похожие ветки 

 
Charly   (2003-09-19 22:58) [0]

В своей программе я использую ф-цию CreateThread(...), чтобы процедура из DLL выполнялась в отдельном потоке. Теперь вот надо предоставить пользователю возможность останавливать работу этой процедуры (например, нажатием кнопки "Отмена").
Может ли кто подбросить пример кода для остановки работы нити, запущенной с помощью CreateThread(...) ? А то я уже окончательно запутался в этом вопросе.

Спасибо всем за внимание!


 
Palladin ©   (2003-09-19 23:29) [1]

в справке Windows SDK посмотри


 
Charly   (2003-09-19 23:40) [2]

Вот в этой-то справке я и запутался. :-((


 
Palladin ©   (2003-09-19 23:43) [3]

ну как так
с CreateThread разобрался, а с остальным никак?


 
Charly   (2003-09-20 00:01) [4]

Вот кусок кода, который у меня есть:



hnd:= CreateThread(nil,0,@u3_2d,nil,0,u32id);
while WaitForSingleObject(hnd,0) <> WAIT_OBJECT_0 do
begin
Application.ProcessMessages;
StBar.Panels[1].Text := Format("%d %%",[cont_2d]);
DoneBar.Position := cont_2d;
Sleep(100);
end;
CloseHandle(hnd);



Он начинает работать, при нажатии на кнопку Caption сменяется на "Остановить".
Хочется, чтобы при повторном нажатии на эту кнопку, нить остановилась. А в каком месте и как это повторное нажатие обрабатывать, я не совсем понимаю.


 
Palladin ©   (2003-09-20 00:08) [5]

ты хочешь сказать что это у тебя прописано в OnClick?


 
Charly   (2003-09-20 00:09) [6]

да, в OnClick


 
Palladin ©   (2003-09-20 00:19) [7]

hnd локальная переменная?


 
Charly   (2003-09-20 00:40) [8]

Да, локальная


procedure TMainForm.Calc_Btn_2Click(Sender: TObject);
var
u32id: Cardinal;
hnd: THandle;

.....
.......


 
jack128 ©   (2003-09-20 00:46) [9]


> Charly

А можно узнать зачем тебе поток? С тем кодом, который здесь приведен поток абсолютно не нужен..


 
Palladin ©   (2003-09-20 00:48) [10]

вынеси ее за пределы процедуры например в класс формы
инициализируй нулем
в следствии этого твой обработчик нажатия немножко должен дополнится
var
nExitCode:integer;
...
if hnd=0 then
begin
hnd:= CreateThread(nil,0,@u3_2d,nil,0,u32id);
while WaitForSingleObject(hnd,0) <> WAIT_OBJECT_0 do
begin
Application.ProcessMessages;
StBar.Panels[1].Text := Format("%d %%",[cont_2d]);
DoneBar.Position := cont_2d;
Sleep(100);
end;
CloseHandle(hnd);
end else
if TerminateThread(hnd,nExitCode)=0 then ShowMessage("Остановка невозможна") else
begin
CloseHandle(hnd); // сомневаюсь нужно ли, но на всякий случай
hnd:=0;
end;


 
Charly   (2003-09-20 00:53) [11]

В том-то и дело, что нужен.
Из DLL, помимо основной процедуры, экспортируется еще и функция, значение которой показывает, сколько процентов вычислений сделано.

DoneBar.Position := cont_2d

DoneBar - это ProgressBar


 
Charly   (2003-09-20 00:59) [12]

to Palladin

Спасибо! Попробую.


 
jack128 ©   (2003-09-20 01:06) [13]

ничего там не нужно..
Процедура u3_2d - это цикл? Скорее всего - да
Вместо
while WaitForSingleObject(hnd,0) <> WAIT_OBJECT_0 do пиши свой цикл, только вставь в него Application.ProcessMessage; вот и все..
при щелчке на кнопку выставляй логич. флаг, а в цикле проверяй его и если нужно выходи из цикла..

> помимо основной процедуры, экспортируется еще и функция,
> значение которой показывает, сколько процентов вычислений
> сделано.

И что это меняет?

Единственно, этот метод не работает если u3_2d - НЕ цикл..Тогда только по TerninateThread, что черевато..


 
jack128 ©   (2003-09-20 01:07) [14]


> // сомневаюсь нужно ли, но на всякий случай

нужно..Поток завершается, но объкт Thread НЕ УНИЧТОЖАЕТСЯ пока все его хендлы не будут закрыты..
P.S. Рихтер рулит :-)


 
Palladin ©   (2003-09-20 01:32) [15]

угу, глянул, точно :)


 
Charly   (2003-09-20 21:27) [16]

to Palladin (сообщение #10)

А где происходит присвоение значения для переменной nExitCode ?

и каким оно должно быть? Я полагаю, оно должно равняться нулю.
правильно?


 
jack128 ©   (2003-09-20 23:19) [17]


> и каким оно должно быть? Я полагаю, оно должно равняться
> нулю.

В большенстве случаев код, возращаемый потоком не используется, поэтому nExitCode может быть любым


 
SergeyX   (2003-09-21 04:15) [18]

u3_2d Это функция из библиотеки?
И вообще библиотеку ты писал?
Или есть у тебя её исходные коды?


 
Charly   (2003-09-26 23:46) [19]

u3_2d - процедура из библиотеки.
Писал не я.
Исходников нету. Мне сказали только имена процедур, которые мне велели использовать.



Страницы: 1 вся ветка

Текущий архив: 2003.10.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
4-27770
KIper
2003-08-04 15:38
2003.10.09
Как создать процесс?


3-27301
Vlad
2003-09-19 12:31
2003.10.09
Вопрос по InterBase


1-27473
Chlavik
2003-09-26 16:55
2003.10.09
Parent у главной формы


4-27788
Виктор
2003-08-04 21:08
2003.10.09
Как получить хэндел едита чужого окна?


1-27571
sagchat
2003-09-29 14:10
2003.10.09
Где найти инфу по Randomize