Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
makhaon
Bellic,
Понятно, я так и думал. Можно попробовать сделать так:
1. Считаем всё до момента необходимости выбора.
2. Включаем visible, либо, лучше, делаем enable кнопкам.
3. Ждём безо всяких циклов когда юзер нажмёт какую-то кнопку.
4. В обработчиках OnClick кнопок развешиваем остальные куски кода, в зависимости от того, что нажмут.
Согласен, что батонокидательство. Но, думаю, в этом случае, допустимое.

Из всего этого все понятно и так есть и будет!
Уже давно пользуюсь "Enabled кнопкам"..))
...
А теперь хотелось бы увидеть Ваше решение 3-го пункта!!!
...
У меня до этого было примерно так (Это и было Вашим 3-м пунктом! - Ожидание!):
Rez := MessageDlg('Найдена фраза для замены. Заменить?',
           mtConfirmation, [mbYes, mbNo, mbCancel], poDefault);
Ну а после этого - анализ ответа (Rez) и соответственно свой код.

Но этот модальный Диалог мне мешал:
1. Если не позицировать его - мешал анализу данных других полей на форме;
2. Если убрать куда-нибуть в угол - как то не "Айс";
3. Модальность не позволяла при необходимости скопировать инфу из Мэмо или Эдитов;
4. ...

Нужно было как то избавиться от Диалога, воспроизведя кнопки на форме и смоделировать режим "Ожидания"... Вот!

P.S. Было еще одно решение, но в силу опять же "модальности", оно тоже было отброшено!
Это было маленькая форма с этими тремя кнопками, без шапки и боковых границ, ... она позиционировалась в нужное место на Осн.форме и кнопки выглядели, как будто принадлежащие Осн.форме...
В общем - это к делу не относится!..))
3 янв 18, 12:46    [21079978]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2806
Да, я уже понял твою проблему.

автор
А теперь хотелось бы увидеть Ваше решение 3-го пункта!!!

Решение без кода :) Просто - ждём до тех пор, пока юзер что-то нажмёт. Как только нажал - считаем дальше. Совсем не обязательно счетную процедуру делать в пределах одного метода.
3 янв 18, 12:52    [21079988]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
makhaon
(это я к тому, что булево значение уже не надо сравнивать с True, вообще не надо ни с чем сравнивать, оно готово для использования в условиях - if Flag2 then)
я прекрасно об этом знаю! Это - мелочи Тестового кода, не стоило в это место меня носом тыкать!..)))
makhaon
Плох Application.ProcessMessages + Sleep

Я уже ответил по этому поводу, читайте выше!
Sleep - только лишь тут в Тестовом коде, дабы замедлить счет от 0 до 5 и от 5 до 10!
Application.ProcessMessages - для того, чтоб опять таки в Тестовом коде в шапке формы не видеть "Не отвечает".

Вот весь анализ

case (Sender as TComponent).Tag of:
 0: {делаем что-то};
 1: {делаем что-то};
 2: {делаем что-то}; 
end;
Тэги в кнопках проставить только.
Мне эта идея больше нравится, чем массивы!..)))
3 янв 18, 13:01    [21080004]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
makhaon
Да, я уже понял твою проблему.

Решение без кода :) Просто - ждём до тех пор, пока юзер что-то нажмёт. Как только нажал - считаем дальше. Совсем не обязательно счетную процедуру делать в пределах одного метода.

Я не понимаю выражения "просто ждем"!
В варианте с Диалоговым окном - понятно было в каком месте это ожидание!
А как в Вашем варианте заставить, к примеру цикл, "просто ждать" ну скажем в своем i/2-состоянии?
3 янв 18, 13:10    [21080010]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
Извиняюсь, что влезаю опять.

Bellic
Я не понимаю выражения "просто ждем"!

Ну есть 2 варианта:
1. "Ждем" - это ждем наступления события;
2. "Просто ждем" - вообще ничего не делаем.

Bellic
заставить, к примеру цикл, "просто ждать"

Никак. Цикл не нужен просто. Скорее всего, не смотря ни на что. Хотя то, что нужно, до сих пор тайна, но я уверен, что не нужен, и хватит одного цикла обработки сообщений (который и так есть), который и события действий пользователя обрабатывает.
Просто ничего не нужно. Нужно вызвать какую-то процедуру при запуске программы и затем вызывать какие-то процедуры при нажатии на кнопки, всё. Всё, пока не будет известна задача.
3 янв 18, 13:23    [21080026]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
Vizit0r, makhaon. Как вы tag то в OnMessage отловите ???? Я первым делом попытался это сделать, и не было ничего в структуре tagMSG

Насчёт handle да, надо было NativeUInt ... Была глубокая ночь, под утром.


Bellic
Может для начало нужно было отловить нажатие левой кнопки мыши (WM_LBUTTONDOWN), а потом проанализировать - а не по нужной ли кнопке мацнул юзер? Или из WM_COMMAND можно сразу Хэндл кнопки узнать?!


У меня так и реализована, проверка нажатие кнопки. + Проверка, на какую нажали по handle
3 янв 18, 13:26    [21080032]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
Циклы к слову вообще не нужны, уже есть ApplicationEvents

Можно и так сделать ведь
+
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = 513 then
  begin
    if not SButtonEnebled then
    begin
      if Msg.hwnd = SButton.Handle then
        SButtonEnebled := true
      else
        Memo1.Lines.Add('Кряя. Надо нажать на SButton');
      exit;
    end;

    if Msg.hwnd = Button1.Handle then
      Memo1.Lines.Add('Нажата кн."Продолжить"')
    else if Msg.hwnd = Button2.Handle then
      Memo1.Lines.Add('Нажата кн."Пропустить"')
    else if Msg.hwnd = Button3.Handle then
      Memo1.Lines.Add('Счет Остановлен!')
    else
      exit;

    SButtonEnebled := false;
  end
  else if Msg.message = 257 then
  begin
    Memo1.Lines.Add('Нажата кнопка: ' + chr(Msg.wParam));
  end;
end;
3 янв 18, 13:34    [21080042]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
YuRock, Вы похоже так "Задачу" и не поняли в отличие от makhaon!...(((
А знаете почему? - Потому, что мыслите стандартно! - По Вашему, раз есть Обработчики событий, то и целостный код нужно "поделить" между ними и заново переписать весь алгоритм!?

Предприму "крайнюю" попытку, лично для Вас на тестовом коде сымитировать и описать Задачу:
(только слезно прошу - не переделывать цикл под свое мышление! - Это всего лишь имитация Реального кода!)
+ Имеется код с Диалогом
unit Main_Module;

interface

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

type
  TMainForm = class(TForm)
    SButton: TButton;
    MLabel: TLabel;
    procedure TestCode(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation
{$R *.dfm}
//------------------------------------------------------------------------------
procedure TMainForm.TestCode(Sender: TObject);
var
  i: Integer;
  Rez : Integer;
label
  M;
begin
     while True do
          begin
  M:           Rez := 0;
               for i := 0 to 1000 do
                    begin
                         MLabel.Caption := IntToStr(i);
                         // Эти два оператора - чисто для замедления счета!
                         Application.ProcessMessages;
                         Sleep(5);

                         if i=500 then
                              Rez := MessageDlg('Досчитали до 500. Продолжить?',
                                   mtCustom, mbYesNoCancel, 0);
                                   // bmYes - Продолжить
                                   // mbNo - Пропустить
                                   // mbCancel - Выйти
                         case Rez of
                              6:   Continue; // Продолжаем счет от 500 до 1000
                              7:   goto M;   // Пропускаем и начинаем с начала
                              2:   Exit;    // Прерываем счет
                         end;
                    end;
          end;
end;
end.

Задача: Избавиться от Диалогового окна и не нарушая алгоритма процедуры и не разваливая ее на 3-4 отдельных, "перенести" три кнопки на форму.
3 янв 18, 14:27    [21080108]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
Bellic
YuRock, Вы похоже так "Задачу" и не поняли в отличие от makhaon!...(((

Можно на ты? Так проще.
Bellic
не разваливая ее на 3-4 отдельных

Почему ты так боишься упрощения кода?
3 янв 18, 14:32    [21080120]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
Да.. Если нужен цикл, то используй таймер. Он уже как бы почти в потоке работает. И выполняй код без тормозов.

Вот его останавливай - запускай, задавай время через сколько он будет срабатывать.
3 янв 18, 14:42    [21080134]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
Bellic
Предприму "крайнюю" попытку, лично для Вас

Спасибо, конечно. Но этот "крайний" код не работоспособен. Ведь TestCode() даже не вызывается нигде.
Если она вызывается в FormCreate и будет "крутиться" постоянно, то действительно нужен отдельный поток. В этом случае надо четко определить состояния результата твоего расчета и когда будет какой-то результат - посылать об этом сообщение главному потоку и ожидать от него команды на продолжение.

Но я в этом до сих пор, мягко говоря, не уверен. Я уже 2 раза просил объяснить задачу, а не показывать "тестовый код". Русским языком объяснить, что тебе заказчик (или препод или кто там) заказал сделать. Твои "тестовые коды" только уводят всё дальше и дальше от понимания задачи не только окружающих, но и тебя.
3 янв 18, 14:42    [21080135]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
Няшик
Да.. Если нужен цикл, то используй таймер. Он уже как бы почти в потоке работает. И выполняй код без тормозов.

Массивы ввели, теперь таймер. Еще надо COM использовать и дотнетовскую библиотеку прикрутить через прослойку-сервер приложений. Для упрощения.
3 янв 18, 14:44    [21080139]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
YuRock,

Таймер то лучше использовать, чем for с sleep и ProcessMessages

Это правильный вариант (Таймер) И самый простой

... Я думаю пользователь делает игру для развития умственных способностей, выполняя действий подсчёт чего - либо то, и нахождения совпадений и так далее

Судя по последнему примеру
3 янв 18, 14:48    [21080151]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
YuRock
Почему ты так боишься упрощения кода?

YuRock, зачем этот вопрос?
Я ведь технически грамотно вроде поставил задачу на Тестовом примере?

Или ты хочешь услышать - что делается в Реальной процедуре, или даже увидеть?
я ведь уже немного писал о ней!
Там открыто на чтение 2 файла, идет цикл побайтового их сравнения (автоматом), и при особых ситуациях требуется Решение оператора, в 3-й файл попадают результаты, на форме - 4 текстовых эдита с промежуточными результатами и еще Окошко типа как в Hex-редакторе (Оффсеты, Нех-значения и литеральное соответствие).
И ты хочешь эти открытые файлы и процедуры взять и закрыть и потом опять их дергать открывание-закрывание и передачей переменных между процедурами?
Нет уж!!!

Кстати - есть аналогичная и Автоматическая процедура, которая отрабатывает от начала и до конца без "тычков" оператора.
Ручная процедура была просто скопирована с Автоматической и дополнена Диалоговым окном и обработкой его результатов.
(Возможно можно будет в будущем оба варианта (Авто и Ручной) сделать для экономии в одной процедуре, но это сейчас не важно.)
3 янв 18, 14:53    [21080156]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
Что мешает открыть файл в одном месте - держать на него ссылку ???

Даже если мы и закрываем файл, мы можем запомнить на какой позиции чтения было закрыто. И при открытии сделать offset ....


Или ты читаешь файл целиком????
3 янв 18, 15:09    [21080175]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 885
ИЗ тс-а вытягивают инфу силой, вымогая - а он суёт свои тестовые коды, где нет подробности информации .... А он думает, что все должны понять его мысль - которую он и сам не может реализовать
3 янв 18, 15:10    [21080176]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
YuRock
Спасибо, конечно. Но этот "крайний" код не работоспособен. Ведь TestCode() даже не вызывается нигде.
TestCode() вызывается единственной кнопкой на форме SButton: TButton;
Неужели это трудно увидеть или догадаться, раз есть Одна процедура, то ее нужно запустить!
Тестовый код - полностью работоспособен!!! - Я же не на бумажке рисую, как Няшик с ошибками!?..)))
(Вот ссылка на полный исходник Теста)
А это - Форма:
+ Текст файла формы "Main_Module.dfm":
object MainForm: TMainForm
  Left = 0
  Top = 0
  Caption = 'MainForm'
  ClientHeight = 77
  ClientWidth = 281
  Color = clAppWorkSpace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object MLabel: TLabel
    Left = 139
    Top = 8
    Width = 7
    Height = 25
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clAqua
    Font.Height = -21
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
  end
  object SButton: TButton
    Left = 102
    Top = 40
    Width = 75
    Height = 25
    Caption = #1047#1072#1087#1091#1089#1090#1080#1090#1100
    TabOrder = 0
    OnClick = TestCode
  end
end

YuRock
Я уже 2 раза просил объяснить задачу, а не показывать "тестовый код". Русским языком объяснить, что тебе заказчик (или препод или кто там) заказал сделать. Твои "тестовые коды" только уводят всё дальше и дальше от понимания задачи не только окружающих, но и тебя.

Меня лично никто никуда не уводит, и вы тоже не убегайте!.)))
Я Задачу поставил - если хотите, решите ее с моими поставленными условиями!
Не можете понять или не хотите тратить время - воля Ваша!

Кратко: Задача, просто избавиться в теле цикла от Диалогового окна с 3-мя кнопками, создав аналогичные кнопки на самой форме, при этом не делить цикл на части(процедуры). Куда уже проще описать без тестового кода?
3 янв 18, 15:15    [21080183]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
Няшик
Что мешает открыть файл в одном месте - держать на него ссылку ???
Даже если мы и закрываем файл, мы можем запомнить на какой позиции чтения было закрыто. И при открытии сделать offset ....
Или ты читаешь файл целиком????
Запомнить можно все и не важно как читается файл(в Memory, TByte, ... или FileStream) - я уже написал, что задача "избавиться от Диалогового окна", не переделывая всю процедуру... Читай выше!
3 янв 18, 15:28    [21080203]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
Bellic
Я ведь технически грамотно вроде поставил задачу на Тестовом примере?

Мне уже настолько надоело, что стало интересно . Вот это - то, что тебе нужно?
Твой тестовый пример на потоке (возможно есть баги, но на глаз я не вижу):
+
unit Unit1;

interface

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

const
  WM_THREAD_UPDATE = WM_USER + 1;
  WM_THREAD_REQUEST = WM_USER + 2;
  WM_THREAD_STOP = WM_USER + 3;

type
  TTestThread = class( TThread )
  private
    FWindowHandle: HWND;
    FWaitEvent: TSimpleEvent;
    FContinueFunc: TMsgDlgBtn;
  protected
    procedure Execute; override;
  public
    constructor Create( AWindowHandle: HWND );
    destructor Destroy; override;

    procedure ContinueCommand( AContinueFlag: TMsgDlgBtn );
  end;

  TForm1 = class(TForm)
    btnRestart: TButton;
    btnContinue: TButton;
    btnStop: TButton;
    Label1: TLabel;
    btnSkip: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnRestartClick(Sender: TObject);
    procedure btnContinueClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure btnSkipClick(Sender: TObject);
  private
    FThread: TTestThread;

    procedure OnThreadUpdate( var Msg: TMessage ); message WM_THREAD_UPDATE;
    procedure OnThreadRequest( var Msg: TMessage ); message WM_THREAD_REQUEST;
    procedure OnThreadStop( var Msg: TMessage ); message WM_THREAD_STOP;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  btnRestart.Enabled := True;
  btnContinue.Enabled := False;
  btnSkip.Enabled := False;
  btnStop.Enabled := False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FThread.Free;
end;

procedure TForm1.OnThreadUpdate( var Msg: TMessage );
begin
  Label1.Caption := IntToStr( Msg.WParam );
end;

procedure TForm1.OnThreadRequest( var Msg: TMessage );
begin
  btnContinue.Enabled := True;
  btnSkip.Enabled := True;
  btnStop.Enabled := True;
end;

procedure TForm1.OnThreadStop( var Msg: TMessage );
begin
  FreeAndNil( FThread );
  btnRestart.Enabled := True;
end;

procedure TForm1.btnRestartClick(Sender: TObject);
begin
  btnRestart.Enabled := False;
  FThread.Free;
  FThread := TTestThread.Create( Handle );
end;

procedure TForm1.btnContinueClick(Sender: TObject);
begin
  btnContinue.Enabled := False;
  btnSkip.Enabled := False;
  btnStop.Enabled := False;
  FThread.ContinueCommand( mbYes );
end;

procedure TForm1.btnSkipClick(Sender: TObject);
begin
  btnContinue.Enabled := False;
  btnSkip.Enabled := False;
  btnStop.Enabled := False;
  FThread.ContinueCommand( mbNo );
end;

procedure TForm1.btnStopClick(Sender: TObject);
begin
  btnContinue.Enabled := False;
  btnSkip.Enabled := False;
  btnStop.Enabled := False;
  FThread.ContinueCommand( mbCancel );
end;

constructor TTestThread.Create( AWindowHandle: HWND );
begin
  FWindowHandle := AWindowHandle;
  FWaitEvent := TSimpleEvent.Create;
  inherited Create( False );
end;

destructor TTestThread.Destroy;
begin
  Terminate;
  FWaitEvent.SetEvent;
  inherited;
  FWaitEvent.Free;
end;

procedure TTestThread.ContinueCommand( AContinueFlag: TMsgDlgBtn );
begin
  FContinueFunc := AContinueFlag;
  FWaitEvent.SetEvent;
end;

procedure TTestThread.Execute;
var
  i: Integer;
begin
  try
    repeat
      for i := 0 to 1000 do begin
        SendMessage( FWindowHandle, WM_THREAD_UPDATE, i, 0 );
        FWaitEvent.WaitFor( 5 );
        if Terminated then
          Exit;

        if i = 500 then begin
          SendMessage( FWindowHandle, WM_THREAD_REQUEST, 0, 0 );
          FWaitEvent.WaitFor( INFINITE );
          if Terminated then
            Exit;

          FWaitEvent.ResetEvent;
          case FContinueFunc of
            mbYes: Continue; // Продолжаем счет от 500 (на самом деле от 501) до 1000
            mbNo: Break; // Пропускаем и начинаем с начала
            else {mbCancel} // Прерываем счет
              Exit;
          end;
        end;
      end;
    until Terminated;
  finally
    PostMessage( FWindowHandle, WM_THREAD_STOP, 0, 0 );
  end;
end;

end.

(Во вложении - проект. Играйся.)


К сообщению приложен файл (Test.zip - 2Kb) cкачать
3 янв 18, 15:33    [21080208]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
Няшик
ИЗ тс-а вытягивают инфу силой, вымогая - а он суёт свои тестовые коды, где нет подробности информации .... А он думает, что все должны понять его мысль - которую он и сам не может реализовать

Знаешь, становится похожим на короля из Мультика "Бременские музыканты", который просто хотел на завтрак съесть кусочек масла, а придворные из этого желания сделали проблему!

Я привожу Вам всем простую Задачу (как просто кусочек Масла), а Вы требуете какие то подробности(может быть нужна инфа по Жирности масла, дате его изготовления, сроке годности или производителе?), которые принесут еще больший головняк и Вам и мне! Нафига спрашивается?
Или Вы просто насмехаетесь надо мной?
3 янв 18, 15:36    [21080211]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
YuRock
Мне уже настолько надоело, что стало интересно . Вот это - то, что тебе нужно?
Твой тестовый пример на потоке (возможно есть баги, но на глаз я не вижу):

Ругнулось при открытие на отсутствие "Project.res", но пересоздала его...)
У меня все работает, согласно "Задаче"... Класс!!! Но лично мне еще "вкурить" это все нужно!
Единственное на взгляд - очень много процедур добавилось, но это не критично, я не придираюсь!
Ну и вопрос - в принципе, обязателен ли тут был Поток?
Без него - какие варианты еще есть?
3 янв 18, 15:51    [21080229]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
Bellic
очень много процедур добавилось

Процедуры btnContinueClick, btnSkipClick, btnStopClick легко превращаются в одну с помощью Tag
Bellic
Ну и вопрос - в принципе, обязателен ли тут был Поток?

Любую задачу можно решить в одном потоке. Иногда это идеальный вариант. Но ты же хранишь условие задачи в секрете, откуда я знаю.
Bellic
Без него - какие варианты еще есть?

Только такие, которые будут тормозить интерфейс.
3 янв 18, 15:59    [21080236]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Dmitri Krizhanovski
Member

Откуда:
Сообщений: 480
Bellic,

Вот так я бы насписАл надцать лет назад и не парился:
+

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    bnRun: TButton;
    MLabel: TLabel;
    bnContinue: TButton;
    bnReRun: TButton;
    bnCancel: TButton;
    procedure bnRunClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bnContinueClick(Sender: TObject);
    procedure bnReRunClick(Sender: TObject);
    procedure bnCancelClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    FProcessing: Boolean;
    FProcessIndex: Integer;
    { Private declarations }
    {
      AFlag
        0 - Run
        1 - Continue
        2 - ReRun
        3 - Cancel
    }
    procedure Processing(AFlag: Integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bnCancelClick(Sender: TObject);
begin
  Processing(3);
end;

procedure TForm1.bnContinueClick(Sender: TObject);
begin
  Processing(1);
end;

procedure TForm1.bnReRunClick(Sender: TObject);
begin
  Processing(2);
end;

procedure TForm1.bnRunClick(Sender: TObject);
begin
  Processing(0);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := not FProcessing;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bnContinue.Enabled := False;
  bnReRun.Enabled := False;
  bnCancel.Enabled := False;
end;

procedure TForm1.Processing(AFlag: Integer);
var
  i: Integer;
begin
  {
      AFlag
        0 - Run
        1 - Continue
        2 - ReRun
        3 - Cancel
  }
  case AFlag of
  0,2:
      begin
        FProcessIndex := 0;
        bnRun.Enabled := False;
        bnContinue.Enabled := False;
        bnReRun.Enabled := False;
        bnCancel.Enabled := False;
      end;
  1:
      begin
        bnContinue.Enabled := False;
        bnReRun.Enabled := False;
        bnCancel.Enabled := False;
      end;
  3:
      begin
        bnRun.Enabled := True;
        bnContinue.Enabled := False;
        bnReRun.Enabled := False;
        bnCancel.Enabled := False;
        Exit;
      end;
  end;

  FProcessing := True;
  try
    for i := FProcessIndex to 1000 do
    begin
      FProcessIndex := i + 1;

      MLabel.Caption := IntToStr(i);
      // Эти два оператора - чисто для замедления счета!
      Application.ProcessMessages;
      Sleep(5);

      if i = 500 then
      begin
        bnContinue.Enabled := True;
        bnReRun.Enabled := True;
        bnCancel.Enabled := True;
        flashwindow(Handle, true);
        Exit;
      end;
    end;
  finally
    FProcessing := False;
  end;

  if i = 1000 then
  begin
    bnRun.Enabled := True;
    bnContinue.Enabled := False;
    bnReRun.Enabled := False;
    bnCancel.Enabled := False;
  end;
end;

end.
до тех пор, пока пользователи не стали бы жаловаться.
А сейчас что-то как у 21080208
3 янв 18, 16:07    [21080245]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Freedoom
Guest
Bellic, на форму кидаешь панельку с тремя (или сколько нужно кнопками), делаешь её не активной, в фомре объявляешь переменную, например FRes: integer, а вместо Rez := MessageDlg вставляешь код
Panel.Enable := True;
FRes := 0;
while FRes = 0 do Application.ProcessMessages;
Panel.Enable := False;
При этом в обработчиках кнопок FRes присваиваешь нужное значение.
3 янв 18, 16:10    [21080247]     Ответить | Цитировать Сообщить модератору
 Re: Обработка нажатия трех кнопок в параллельном потоке  [new]
Bellic
Member

Откуда: Ростов-на-Дону
Сообщений: 231
YuRock
Процедуры btnContinueClick, btnSkipClick, btnStopClick легко превращаются в одну с помощью Tag

Это понятно:
+
procedure TForm1.ContinueSkipStopClick(Sender: TObject);
begin
  btnContinue.Enabled := False;
  btnSkip.Enabled := False;
  btnStop.Enabled := False;
  case (Sender as TComponent).Tag of
      1: FThread.ContinueCommand( mbYes );
      2: FThread.ContinueCommand( mbNo );
      3: FThread.ContinueCommand( mbCancel );
  end;
end;
3 янв 18, 16:15    [21080251]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить