Форум: "Основная";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
ВнизОстановить выполнение нити Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c