Главная страница
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.5 MB
Время: 0.024 c
1-1095949017
zokzok
2004-09-23 18:16
2004.10.10
StringGrid


3-1094732636
bers
2004-09-09 16:23
2004.10.10
Добавить поля не потеряв данных


4-1094559475
kblc
2004-09-07 16:17
2004.10.10
Как для TRichEdit ...


1-1096289020
Dimon_St
2004-09-27 16:43
2004.10.10
Помогите найти библиотеку (Построение B-сплайнов)


4-1094644439
Apolo
2004-09-08 15:53
2004.10.10
Пару вопросов по потокам