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

Вниз

Как завершить процес???   Найти похожие ветки 

 
XM-AD   (2004-09-23 15:07) [0]

Господа! Такой вопрос!
Создаю процесс, который выполняет следущее действо:

procedure MyThread.Execute;
begin
while not Terminated  do
begin
 //операции
 sleep(50);
end;
end;

только есть проблема - при закрытии программы возникает ошибка raiseв expression бла-бла-бла на этом самом sleep
Как сделать чтобы прога нормально закрывалась????


 
Digitman ©   (2004-09-23 15:21) [1]


> возникает ошибка raiseв expression бла-бла-бла на этом самом
> sleep


sleep() не может возбудить исключение, не выдумывай

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


 
DVM ©   (2004-09-23 15:29) [2]


> Создаю процесс, который выполняет следущее действо:

только это не процесс, а поток.


 
Linco   (2004-09-23 15:33) [3]

Исключение вызывает не sleep а, вероятно, поток, некорректно уничтожается, попробуйте при создании потока, либо в Onterminate:  
FreeOnTerminate := True;


 
XM-AD   (2004-09-23 15:53) [4]

Полный текст сообщения об ошибке: (хотя я не думаю, что это что-то разъяснит)
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) [5]

Полный текст сообщения об ошибке: (хотя я не думаю, что это что-то разъяснит)
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


 
Sandman25 ©   (2004-09-23 15:55) [6]

MainForm.canvas.draw

Про Synchronize знаете?


 
Erik1 ©   (2004-09-23 16:02) [7]

Вобщето вместо 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;
Бери я сегодня добрый.


 
Linco   (2004-09-23 16:03) [8]

Если нужно что-то нарисовать из потока используйте
canvas.lock;
canvas.draw;
canvas.unlock;

Попробуйте, может причина в этом.


 
Sandman25 ©   (2004-09-23 16:03) [9]

[7] Erik1 ©   (23.09.04 16:02)

"удобнее" не совсем подходящее слово, ИМХО :)


 
Erik1 ©   (2004-09-23 16:13) [10]

To Sandman25
Почему, раньше я использовал Sleep после освоения Wait функций перестал им пользоватся. Например в случие теримнирования потока приходится ожидать пока этот Sleep выполнится, а так выходим сразу как только возможно. У меня вобще свой базовай класс написан для потоков.


 
Digitman ©   (2004-09-23 16:14) [11]


> XM-AD   (23.09.04 15:53) [5]


сначала нужно терминировать поток (и дождаться его фактического завершения !!!), а уж только потом терминировать процесс приложения

иначе как раз и получается такая глупая ситуация)


 
Sandman25 ©   (2004-09-23 16:23) [12]

[10] Erik1 ©   (23.09.04 16:13)

Что удобнее - написать sleep(N) или подключать модуль, вспоминать название и параметры функции?


 
Erik1 ©   (2004-09-23 16:43) [13]

To Sandman25
Просто так поток непаявляется, значить стоит более мение серезная задача и надо незабыть синхноризацию, методы окончания потока, совмествый доступ к переменым, вобщем работы хватает. Я мне надо подключить модуль и унаследоватся от своего класса, он у меня кучу работы делает. А Copy+Paste это плохой стиль програмирования.


 
Sandman25 ©   (2004-09-23 16:46) [14]

[13] Erik1 ©   (23.09.04 16:43)

Наконец-то. sleep удобнее, а своя функция правильнее.



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

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

Наверх




Память: 0.48 MB
Время: 0.023 c
14-1095877438
_silver
2004-09-22 22:23
2004.10.10
Дальнеёшее развитие процессоров.


11-1081262281
m5
2004-04-06 18:38
2004.10.10
Как сделать в КОЛ всплывающее окошко с подсказками?


8-1090344059
Игорь Н.
2004-07-20 21:20
2004.10.10
Вставка изображения на форму


6-1091484185
viSn
2004-08-03 02:03
2004.10.10
idhttp Получить HTML код страницы и вывести в memo1


14-1095795066
Opilki_Inside
2004-09-21 23:31
2004.10.10
Кто-нибудь сталкивался с Qt-library?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский