![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как завершить процес??? [D6, Win95/98]
XM-AD © (2004-09-23 15:07:00)Господа! Такой вопрос!
Создаю процесс, который выполняет следущее действо:
procedure MyThread.Execute;
begin
while not Terminated do
begin
//операции
sleep(50);
end;
end;
только есть проблема - при закрытии программы возникает ошибка raiseв expression бла-бла-бла на этом самом sleep
Как сделать чтобы прога нормально закрывалась????
Sandman25 (2004-09-23 16:46:00) [1][13] Erik1 © (23.09.04 16:43)
Наконец-то. sleep удобнее, а своя функция правильнее.
Erik1 (2004-09-23 16:43:00) [2]To Sandman25
Просто так поток непаявляется, значить стоит более мение серезная задача и надо незабыть синхноризацию, методы окончания потока, совмествый доступ к переменым, вобщем работы хватает. Я мне надо подключить модуль и унаследоватся от своего класса, он у меня кучу работы делает. А Copy+Paste это плохой стиль програмирования.
Sandman25 (2004-09-23 16:23:00) [3][10] Erik1 © (23.09.04 16:13)
Что удобнее - написать sleep(N) или подключать модуль, вспоминать название и параметры функции?
Digitman (2004-09-23 16:14:00) [4]
> XM-AD (23.09.04 15:53) [5]
сначала нужно терминировать поток (и дождаться его фактического завершения !!!), а уж только потом терминировать процесс приложения
иначе как раз и получается такая глупая ситуация)
Erik1 (2004-09-23 16:13:00) [5]To Sandman25
Почему, раньше я использовал Sleep после освоения Wait функций перестал им пользоватся. Например в случие теримнирования потока приходится ожидать пока этот Sleep выполнится, а так выходим сразу как только возможно. У меня вобще свой базовай класс написан для потоков.
Linco (2004-09-23 16:03:00) [6]Если нужно что-то нарисовать из потока используйте
canvas.lock;
canvas.draw;
canvas.unlock;
Попробуйте, может причина в этом.
Sandman25 (2004-09-23 16:03:00) [7][7] Erik1 © (23.09.04 16:02)
"удобнее" не совсем подходящее слово, ИМХО :)
Erik1 (2004-09-23 16:02:00) [8]Вобщето вместо Sleep удобнее использовать WaitForMultipleObjects Привер:
Status := WaitForMultipleObjects(Ord(High(tmEvent.Event)) + 1,@tmEvent.Event, false, fTimeOut); //INFINITE
case Status of
Ord(Low(TActiveEvent))..Ord(High(TActiveEvent)):
begin
tmEvent.Call[TActiveEvent(Status)](Self);
if (TActiveEvent(Status) <> actExit) then
Synchronize(DoFinished);
end;
Описано tmEvent так:
TActiveEvent = (actExit, actSend);
RAction = record
Event: array[TActiveEvent] of THandle;
Call: array[TActiveEvent] of TNotifyEvent;
end;
Бери я сегодня добрый.
Sandman25 (2004-09-23 15:55:00) [9]MainForm.canvas.draw
Про Synchronize знаете?
XM-AD (2004-09-23 15:53:00) [10]Полный текст сообщения об ошибке: (хотя я не думаю, что это что-то разъяснит)
Project vip_day.exe raised exception class EAccessViolation with message 'Access violation at address 00C520C7. Write of address 018A40B8'. Project stopped. Use Step or Run to continue.
Компилятор останавливает курсор выполнения как раз на sleep(50);
Причем иногда приложение закрывается нормально, я так подозреваю в те моменты когда выполняется то, что перед sleep, а там MainForm.canvas.draw
когда sleep закоментирована все закрывается нормально... только перерисовка очень быстро идет :):):)
FreeOnTerminate := True; вызывается при MyThread.create
XM-AD (2004-09-23 15:53:00) [11]Полный текст сообщения об ошибке: (хотя я не думаю, что это что-то разъяснит)
Project vip_day.exe raised exception class EAccessViolation with message 'Access violation at address 00C520C7. Write of address 018A40B8'. Project stopped. Use Step or Run to continue.
Компилятор останавливает курсор выполнения как раз на sleep(50);
Причем иногда приложение закрывается нормально, я так подозреваю в те моменты когда выполняется то, что перед sleep, а там MainForm.canvas.draw
когда sleep закоментирована все закрывается нормально... только перерисовка очень быстро идет :):):)
FreeOnTerminate := True; вызывается при MyThread.create
Linco (2004-09-23 15:33:00) [12]Исключение вызывает не sleep а, вероятно, поток, некорректно уничтожается, попробуйте при создании потока, либо в Onterminate:
FreeOnTerminate := True;
DVM (2004-09-23 15:29:00) [13]
> Создаю процесс, который выполняет следущее действо:
только это не процесс, а поток.
Digitman (2004-09-23 15:21:00) [14]
> возникает ошибка raiseв expression бла-бла-бла на этом самом
> sleep
sleep() не может возбудить исключение, не выдумывай
и что еще за "бла-бла-бла" ? что , буквы незнакомые в сообщении об ошибке ? ты даже не в состоянии скопировать сюда точный текст сообщение об исключении, если с переводом этого текста у тебя проблемы ?