Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
1-27599
SergP
2003-09-22 09:03
2003.10.09
Можно ли быстро вычистить TTreeView?


1-27442
Артем
2003-09-28 08:54
2003.10.09
Вопрос по компоненту WebBrowser


1-27457
SergP
2003-09-27 10:43
2003.10.09
Уничтожение объекта с помощью PostMessage..


1-27446
Winam
2003-09-27 16:23
2003.10.09
Поиск в масиве символов


3-27357
zzzrrv
2003-09-19 14:27
2003.10.09
Доступ к полям типа DATASET





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский