Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2009, 21:26   #1
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию Как выпоступаете в случае использования ProcessMessage?

Доброго времени суток. Вот сижу и думаю, выполнив некую процедуру из нее вызываю ProcessMessage для того, что.s избежать зависания интерфейса... Но как реализовать остановку этой процедуры? Например, если она не сильно кретична и можно е прервать есть ли методы как из одной процедуры прервать выполняющуюся другую? Или же просто использовать переменную-маркер и если она становится ложна прервать процедуру изнутри?
p.s. Просто интересно как вы обрабатываете такие ситуации?
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 13.08.2009, 21:41   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если честно то я использую потоки в таком случае
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2009, 21:42   #3
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

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

Код:
var
  Terminated: Boolean

---\\\Остальной код\\\---


if Terminated then Exit; // а это будет проверка не завершаем мы ли досрочно работу процедуры
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 13.08.2009, 21:44   #4
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если честно то я использую потоки в таком случае
В принципе уже дошел до этого, но переделывать неохото стало, и почему то не работал ADOQuery в потоке...

А кроме глобальной перемнной есть варианты? Это уже чисто ради интереса?
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 13.08.2009, 22:11   #5
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от Mixasik Посмотреть сообщение
... выполнив некую процедуру из нее вызываю ProcessMessage для того, что.s избежать зависания интерфейса...
Не совсем понят вызываете после выполнения процедуры или в конце процедуры или когда?
В первых двух случаях (если процедура не выполняется в длинном цикле) приложение и так должно перейти к обработке сообщений.

ProcessMessage, как я понимаю хорошо использовать если у вас длительный код в виде цикла. Тогда на каждом проходе дать возможность приложению обработать сообщения (например нажатие кнопки), затем проверить глобальную переменную (выставленную перед началом цикла) как написал DarkEvil (можно вместо глобальной использовать поле формы
Код:
  TForm1 = class(TForm)
    // .......
  private
    MyFunctTerminated: Boolean;
А эту переменную сбрасывать в обработчике нажатия кнопки.

(могу в чем-то ошибаться - давно не использовал ProcessMessage, предпочитаю потоки)
s.Creator вне форума Ответить с цитированием
Старый 13.08.2009, 22:25   #6
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Да именно в цикле) Но мне самое интересное, можно ли из одной функции завершить(прервать) другую... Вот любопытно и все.
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 13.08.2009, 22:27   #7
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Ну можна в другой функции Terminated установить в true
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 13.08.2009, 22:30   #8
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Цитата:
Сообщение от DarkEvil Посмотреть сообщение
Ну можна в другой функции Terminated установить в true
Это, если поток прерывать или изменить значение глобальной переменной, которая проверяется внутри первой функции и она сама себя прервет, а как ее принудительно прервать?)
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 13.08.2009, 22:39   #9
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Что-то я нечего с ваших слов непонял
вот вам пример:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Test_button: TButton;
    Terminate_button: TButton;
    procedure Test_buttonClick(Sender: TObject);
    procedure Terminate_buttonClick(Sender: TObject);
  private
    procedure test();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Terminated : Boolean = false;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Terminate_buttonClick(Sender: TObject);
begin
  Terminated := true;
end;

procedure TForm1.test;
var
  I: Integer;
begin
  for I := 0 to 10000000 do
  begin
    if Terminated then Exit
    else Form1.Caption := 'I = ' + IntToStr(I);
    Application.ProcessMessages;
  end;
end;

procedure TForm1.Test_buttonClick(Sender: TObject);
begin
  test();
end;

end.
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 13.08.2009, 22:48   #10
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Ну так надо прописать в каком случаи Terminated будет тру и когда выходить. Т.е сейчас у Вас просто если Terminated = true тогда остановить цикл? А когда Terminated будет равняться правде та? Цикл та этого не знает...
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать в Дeлфи класс в DLL для использования его в VC++ Dmitriy.Ch Общие вопросы Delphi 0 25.07.2009 08:40
Как отследить нажатие на ссылку, без использования JS [Smarik] PHP 2 04.07.2009 15:27
Dblookupcombobox автоматическое заполнение в случае одного значения 1sal1 БД в Delphi 1 07.10.2008 21:41
Как Firefox рассчитывает ширину столбцов вот в таком случае??? Finer HTML и CSS 3 26.04.2008 16:47
Delphi, рекурсия, как сделать все возможные N-ки чисел (сколько столбцов такая N-ка,в данном случае 3)? domik Помощь студентам 5 26.09.2007 16:43