Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > как прервать выполненеи проги


Автор: razumsap 7.3.2008, 12:09
Привет всем. Вопрос может и глупый но я чёт с ним уже долго борюсь.

Написал программу  с использованием встроенного webbrowser-а, когда грзится страничка в нём кнопка закрыть не работает
может из-за этого куска - полной загрузки странички
Код

   while pg <> k do
   Application.ProcessMessages;


и всё же как программно прервать и корректно выйти из программы.

Автор: kemiisto 7.3.2008, 18:25
Цитата(razumsap @  7.3.2008,  12:09 Найти цитируемый пост)
может из-за этого куска - полной загрузки странички


Интересно конечно, что такое 
Код

pg
 и 
Код

k
, но не думаю, что из-за 
Код

Application.ProcessMessages
 не будет работать кнопка закрыть. Скорее, наоборот....

Автор: Christoph 7.3.2008, 19:38
тебе надо выйти из цикла? break, exit

Автор: aalexstorm 10.3.2008, 15:20
if условие then break - завершение цикла.
Application.Terminate - завершение приложения.

Автор: Serjone 11.3.2008, 12:45
у меня возможно подобная проблема. Использую indy, при отправке запроса на php страницу при отключенном интернете, программа перестает закрываться стандартными методами, приходится юзать halt для аварийного завершения.

Автор: razumsap 11.3.2008, 12:52
Пивет, может я не праильно выразился, но дело происходит так 
Запускается сайт 
дожидается полная загрузка странички вот такой процедурой

Код

pg:integer;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
   CurWebrowser: IWebBrowser;
   TopWebBrowser: IWebBrowser;
   Document: OleVariant;
   WindowName: string;

  HTMLDocument: IHTMLDocument2;
  PersistFile: IPersistFile;
  state:integer;

 begin
   CurWebrowser := pDisp as IWebBrowser;
   TopWebBrowser := (Sender as TWebBrowser).DefaultInterface;

   if CurWebrowser = TopWebBrowser then
   pg:=pg+1;
 end;


и чтоб программа дожидалась полной загрузки сайта стоит условие 

   while pg <> k do
   Application.ProcessMessages;

(K-тожпеременная типа intrger)

Дело в том что прога работает правильно, но от начала и ло конца, а вот я не могу её прервать во время её работы (остановить  выполнение действий самого браузера, он продолжает работать дальше)
Я даж прикрепил кноку и обработчик по её остановке (как мне посоветовали выше)

Код

procedure TForm1.BitBtn2Click(Sender: TObject);
var i:integer;
begin
webbrowser1.Stop;
Application.Terminate;

end;


но ничего не происходит прога работает дальше, что делать? как её тормознуть (прогу или скорее правильно сказать работу WebBrowsera)

Автор: ama_kid 11.3.2008, 13:47
Цитата(razumsap @  11.3.2008,  12:52 Найти цитируемый пост)
и чтоб программа дожидалась полной загрузки сайта стоит условие 
   while pg <> k do
   Application.ProcessMessages;

Имхо надо выкинуть это и будет тебе щастье... Обработчик WebBrowser1DocumentComplete вызывется только когда документ загружен, поэтому тебе надо не его прерывать, а работу WebBrowser'a, что и делается командой Stop...

Автор: razumsap 1.4.2008, 08:57
Цитата(ama_kid @ 11.3.2008,  13:47)
Цитата(razumsap @  11.3.2008,  12:52 Найти цитируемый пост)
и чтоб программа дожидалась полной загрузки сайта стоит условие 
   while pg <> k do
   Application.ProcessMessages;

Имхо надо выкинуть это и будет тебе щастье... Обработчик WebBrowser1DocumentComplete вызывется только когда документ загружен, поэтому тебе надо не его прерывать, а работу WebBrowser'a, что и делается командой Stop...

Привет. Сделал как ты и сказал, но вот проблема, после выполнения ниже идущего кода

webbrowser1.Stop;
Application.Terminate;

прога возвращается в предыдущюю процедуру где опятьь таки выполняется код

   while pg <> k do
   Application.ProcessMessages;

почему webbrowser1.Stop; не остановил весь процесс, не пойму?

Автор: MadCoder 1.4.2008, 10:28
Цитата(razumsap @ 1.4.2008,  08:57)
Цитата(ama_kid @ 11.3.2008,  13:47)
Цитата(razumsap @  11.3.2008,  12:52 Найти цитируемый пост)
и чтоб программа дожидалась полной загрузки сайта стоит условие 
   while pg <> k do
   Application.ProcessMessages;

Имхо надо выкинуть это и будет тебе щастье... Обработчик WebBrowser1DocumentComplete вызывется только когда документ загружен, поэтому тебе надо не его прерывать, а работу WebBrowser'a, что и делается командой Stop...

Привет. Сделал как ты и сказал, но вот проблема, после выполнения ниже идущего кода

webbrowser1.Stop;
Application.Terminate;

прога возвращается в предыдущюю процедуру где опятьь таки выполняется код

   while pg <> k do
   Application.ProcessMessages;

почему webbrowser1.Stop; не остановил весь процесс, не пойму?

А если так написать:
Код

while (pg <> k) and (Stop=False) do
   Application.ProcessMessages;

А на выключение проги написать:
Код

Stop:=True;

Автор: razumsap 1.4.2008, 10:45
Цитата(MadCoder @ 1.4.2008,  10:28)
Цитата(razumsap @ 1.4.2008,  08:57)
Цитата(ama_kid @ 11.3.2008,  13:47)
Цитата(razumsap @  11.3.2008,  12:52 Найти цитируемый пост)
и чтоб программа дожидалась полной загрузки сайта стоит условие 
   while pg <> k do
   Application.ProcessMessages;

Имхо надо выкинуть это и будет тебе щастье... Обработчик WebBrowser1DocumentComplete вызывется только когда документ загружен, поэтому тебе надо не его прерывать, а работу WebBrowser'a, что и делается командой Stop...

Привет. Сделал как ты и сказал, но вот проблема, после выполнения ниже идущего кода

webbrowser1.Stop;
Application.Terminate;

прога возвращается в предыдущюю процедуру где опятьь таки выполняется код

   while pg <> k do
   Application.ProcessMessages;

почему webbrowser1.Stop; не остановил весь процесс, не пойму?

А если так написать:
Код

while (pg <> k) and (Stop=False) do
   Application.ProcessMessages;

А на выключение проги написать:
Код

Stop:=True;

Вот нарыл помогло, кстате тут на форуме smile
TerminateProcess( GetCurrentProcess, 0 );

Автор: Alexeis 1.4.2008, 10:57
razumsap, ну если нужно жестоко убить, то проще всего Halt smile 

Автор: razumsap 3.4.2008, 12:24
Цитата(Alexeis @ 1.4.2008,  10:57)
razumsap, ну если нужно жестоко убить, то проще всего Halt smile

Жестоко не надо, но вот это деяние    Application.ProcessMessages;
в цикле

   while pg <> k do
   Application.ProcessMessages;

не дает ничего сделать енто не подошло - согласенsmile
TerminateProcess( GetCurrentProcess, 0 );

написал так
Код

webbrowser1.Stop;
Application.ProcessMessages;
Application.Terminate;

но работа браузера останавливается, если не выполняется вы шеуказанный цикл.

Вобщем фигня, пока забросил эту часть smile 

Автор: Alexeis 3.4.2008, 12:51
Application.Terminate; выполняет всего навсего PostQuitMessage(0); 
Т.е. пока не будет обработано сообщение ничего закроется. 

Чтобы убить webbrowser1, можно попробовать освободить интерфейс COM объекта, после чего, если ссылок не осталось можно смело все уничтожать. 

Автор: imageman 3.4.2008, 18:40
PS.

а 
Код

 while pg <> k do
   Application.ProcessMessages;

не грузит намертво процессор? 

может лучше так
 while pg <> k do begin
   Application.ProcessMessages;
   sleep(50);
 end;

только мне не нравятся такие комбинации. Может лучше таймер поставить с периодичностью 100 мсек?

Автор: MetalFan 3.4.2008, 22:14
вообще без нужды и осознанности применение ProcessMessages - зло! )

Автор: razumsap 7.4.2008, 09:44
Цитата(imageman @ 3.4.2008,  18:40)
PS.

а 
Код

 while pg <> k do
   Application.ProcessMessages;

не грузит намертво процессор? 

может лучше так
 while pg <> k do begin
   Application.ProcessMessages;
   sleep(50);
 end;

только мне не нравятся такие комбинации. Может лучше таймер поставить с периодичностью 100 мсек?

Дело в том что pg говорит о загрузке документа (полностью)
Код

 begin
   CurWebrowser := pDisp as IWebBrowser;
   TopWebBrowser := (Sender as TWebBrowser).DefaultInterface;

   if CurWebrowser = TopWebBrowser then
   pg:=pg+1;
 end;


и если у человека очень медленный инет, то задерка 100 или 1000 не поможет:(
и если  ProcessMessages - зло! - то какова альтернатива?

Автор: MetalFan 7.4.2008, 17:11
Цитата(razumsap @  7.4.2008,  09:44 Найти цитируемый пост)
Дело в том что pg говорит о загрузке документа (полностью)

а чем OnDocumentComplete не устраивает?


Автор: razumsap 8.4.2008, 08:54
Цитата(MetalFan @ 7.4.2008,  17:11)
Цитата(razumsap @  7.4.2008,  09:44 Найти цитируемый пост)
Дело в том что pg говорит о загрузке документа (полностью)

а чем OnDocumentComplete не устраивает?

Неустраивает тем, что как показала практика, он срабатывает только один первый раз, затем если браузер обработав событие загружает результат обработки (это касается пхп - где по одному адресу на одной странице выдаются разные результаты) и считает что это тотже документ не дождавшись его загрузки выпоьняет дальнейшие действия в программе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)