Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.035 c
1-1095767994
avsam
2004-09-21 15:59
2004.10.10
Edit (Combobox) с выпадающим калькулятором


4-1094652705
Grafsky
2004-09-08 18:11
2004.10.10
Информация о дисках


3-1095068946
aliced
2004-09-13 13:49
2004.10.10
Где хранятся данные для CachedUpdates?


8-1089292943
ser_ega
2004-07-08 17:22
2004.10.10
Image


6-1090316461
highlander
2004-07-20 13:41
2004.10.10
Отправка СМС-сообщений, используя HTTP





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