powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обработка нажатия трех кнопок в параллельном потоке
25 сообщений из 110, страница 3 из 5
Обработка нажатия трех кнопок в параллельном потоке
    #39578913
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonBellic,
Понятно, я так и думал. Можно попробовать сделать так:
1. Считаем всё до момента необходимости выбора.
2. Включаем visible, либо, лучше, делаем enable кнопкам.
3. Ждём безо всяких циклов когда юзер нажмёт какую-то кнопку.
4. В обработчиках OnClick кнопок развешиваем остальные куски кода, в зависимости от того, что нажмут.
Согласен, что батонокидательство. Но, думаю, в этом случае, допустимое.
Из всего этого все понятно и так есть и будет!
Уже давно пользуюсь "Enabled кнопкам"..))
...
А теперь хотелось бы увидеть Ваше решение 3 -го пункта!!!
...
У меня до этого было примерно так (Это и было Вашим 3-м пунктом! - Ожидание!):
Код: pascal
1.
2.
Rez := MessageDlg('Найдена фраза для замены. Заменить?',
           mtConfirmation, [mbYes, mbNo, mbCancel], poDefault);

Ну а после этого - анализ ответа (Rez) и соответственно свой код.

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

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

P.S. Было еще одно решение, но в силу опять же "модальности", оно тоже было отброшено!
Это было маленькая форма с этими тремя кнопками, без шапки и боковых границ, ... она позиционировалась в нужное место на Осн.форме и кнопки выглядели, как будто принадлежащие Осн.форме...
В общем - это к делу не относится!..))
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578918
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я уже понял твою проблему.

авторА теперь хотелось бы увидеть Ваше решение 3-го пункта!!!
Решение без кода :) Просто - ждём до тех пор, пока юзер что-то нажмёт. Как только нажал - считаем дальше. Совсем не обязательно счетную процедуру делать в пределах одного метода.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578923
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon(это я к тому, что булево значение уже не надо сравнивать с True, вообще не надо ни с чем сравнивать, оно готово для использования в условиях - if Flag2 then) я прекрасно об этом знаю! Это - мелочи Тестового кода, не стоило в это место меня носом тыкать!..)))
makhaonПлох Application.ProcessMessages + Sleep
Я уже ответил по этому поводу, читайте выше!
Sleep - только лишь тут в Тестовом коде, дабы замедлить счет от 0 до 5 и от 5 до 10!
Application.ProcessMessages - для того, чтоб опять таки в Тестовом коде в шапке формы не видеть "Не отвечает".

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

Код: pascal
1.
2.
3.
4.
5.
case (Sender as TComponent).Tag of:
 0: {делаем что-то};
 1: {делаем что-то};
 2: {делаем что-то}; 
end;

Тэги в кнопках проставить только. Мне эта идея больше нравится, чем массивы!..)))
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578927
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonДа, я уже понял твою проблему.

Решение без кода :) Просто - ждём до тех пор, пока юзер что-то нажмёт. Как только нажал - считаем дальше. Совсем не обязательно счетную процедуру делать в пределах одного метода.
Я не понимаю выражения "просто ждем"!
В варианте с Диалоговым окном - понятно было в каком месте это ожидание!
А как в Вашем варианте заставить, к примеру цикл, "просто ждать" ну скажем в своем i/2 -состоянии?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578932
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, что влезаю опять.

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

Bellicзаставить, к примеру цикл, "просто ждать"
Никак. Цикл не нужен просто. Скорее всего, не смотря ни на что. Хотя то, что нужно, до сих пор тайна, но я уверен, что не нужен, и хватит одного цикла обработки сообщений (который и так есть), который и события действий пользователя обрабатывает.
Просто ничего не нужно. Нужно вызвать какую-то процедуру при запуске программы и затем вызывать какие-то процедуры при нажатии на кнопки, всё. Всё, пока не будет известна задача.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578934
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r, makhaon. Как вы tag то в OnMessage отловите ???? Я первым делом попытался это сделать, и не было ничего в структуре tagMSG

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


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

У меня так и реализована, проверка нажатие кнопки. + Проверка, на какую нажали по handle
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578938
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Циклы к слову вообще не нужны, уже есть ApplicationEvents

Можно и так сделать ведь
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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;

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

Предприму "крайнюю" попытку, лично для Вас на тестовом коде сымитировать и описать Задачу:
(только слезно прошу - не переделывать цикл под свое мышление! - Это всего лишь имитация Реального кода!)
Имеется код с Диалогом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
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 отдельных, "перенести" три кнопки на форму.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578960
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic YuRock , Вы похоже так "Задачу" и не поняли в отличие от makhaon !...(((
Можно на ты? Так проще.
Bellic не разваливая ее на 3-4 отдельных
Почему ты так боишься упрощения кода?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578964
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.. Если нужен цикл, то используй таймер. Он уже как бы почти в потоке работает. И выполняй код без тормозов.

Вот его останавливай - запускай, задавай время через сколько он будет срабатывать.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578965
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicПредприму "крайнюю" попытку, лично для Вас
Спасибо, конечно. Но этот "крайний" код не работоспособен. Ведь TestCode() даже не вызывается нигде.
Если она вызывается в FormCreate и будет "крутиться" постоянно, то действительно нужен отдельный поток. В этом случае надо четко определить состояния результата твоего расчета и когда будет какой-то результат - посылать об этом сообщение главному потоку и ожидать от него команды на продолжение.

Но я в этом до сих пор, мягко говоря, не уверен. Я уже 2 раза просил объяснить задачу, а не показывать "тестовый код". Русским языком объяснить, что тебе заказчик (или препод или кто там) заказал сделать. Твои "тестовые коды" только уводят всё дальше и дальше от понимания задачи не только окружающих, но и тебя.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578968
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикДа.. Если нужен цикл, то используй таймер. Он уже как бы почти в потоке работает. И выполняй код без тормозов.
Массивы ввели, теперь таймер. Еще надо COM использовать и дотнетовскую библиотеку прикрутить через прослойку-сервер приложений. Для упрощения.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578972
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

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

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

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

Судя по последнему примеру
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578973
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockПочему ты так боишься упрощения кода?
YuRock , зачем этот вопрос?
Я ведь технически грамотно вроде поставил задачу на Тестовом примере?

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

Кстати - есть аналогичная и Автоматическая процедура, которая отрабатывает от начала и до конца без "тычков" оператора.
Ручная процедура была просто скопирована с Автоматической и дополнена Диалоговым окном и обработкой его результатов.
(Возможно можно будет в будущем оба варианта (Авто и Ручной) сделать для экономии в одной процедуре, но это сейчас не важно.)
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578978
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мешает открыть файл в одном месте - держать на него ссылку ???

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


Или ты читаешь файл целиком????
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578979
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИЗ тс-а вытягивают инфу силой, вымогая - а он суёт свои тестовые коды, где нет подробности информации .... А он думает, что все должны понять его мысль - которую он и сам не может реализовать
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578982
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockСпасибо, конечно. Но этот "крайний" код не работоспособен. Ведь TestCode() даже не вызывается нигде. TestCode() вызывается единственной кнопкой на форме SButton: TButton ;
Неужели это трудно увидеть или догадаться, раз есть Одна процедура, то ее нужно запустить!
Тестовый код - полностью работоспособен!!! - Я же не на бумажке рисую, как Няшик с ошибками!?..)))
( Вот ссылка на полный исходник Теста )
А это - Форма:
Текст файла формы "Main_Module.dfm":
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
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-мя кнопками, создав аналогичные кнопки на самой форме, при этом не делить цикл на части(процедуры). Куда уже проще описать без тестового кода?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578990
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикЧто мешает открыть файл в одном месте - держать на него ссылку ???
Даже если мы и закрываем файл, мы можем запомнить на какой позиции чтения было закрыто. И при открытии сделать offset ....
Или ты читаешь файл целиком????Запомнить можно все и не важно как читается файл(в Memory, TByte, ... или FileStream) - я уже написал, что задача "избавиться от Диалогового окна", не переделывая всю процедуру... Читай выше!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578991
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicЯ ведь технически грамотно вроде поставил задачу на Тестовом примере?
Мне уже настолько надоело, что стало интересно . Вот это - то, что тебе нужно?
Твой тестовый пример на потоке (возможно есть баги, но на глаз я не вижу):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
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.


(Во вложении - проект. Играйся.)
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578993
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикИЗ тс-а вытягивают инфу силой, вымогая - а он суёт свои тестовые коды, где нет подробности информации .... А он думает, что все должны понять его мысль - которую он и сам не может реализовать
Знаешь, становится похожим на короля из Мультика "Бременские музыканты", который просто хотел на завтрак съесть кусочек масла, а придворные из этого желания сделали проблему!

Я привожу Вам всем простую Задачу ( как просто кусочек Масла ), а Вы требуете какие то подробности( может быть нужна инфа по Жирности масла, дате его изготовления, сроке годности или производителе? ), которые принесут еще больший головняк и Вам и мне! Нафига спрашивается?
Или Вы просто насмехаетесь надо мной?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578995
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockМне уже настолько надоело, что стало интересно . Вот это - то, что тебе нужно?
Твой тестовый пример на потоке (возможно есть баги, но на глаз я не вижу):
Ругнулось при открытие на отсутствие "Project.res", но пересоздала его...)
У меня все работает, согласно "Задаче"... Класс!!! Но лично мне еще "вкурить" это все нужно!
Единственное на взгляд - очень много процедур добавилось, но это не критично, я не придираюсь!
Ну и вопрос - в принципе, обязателен ли тут был Поток?
Без него - какие варианты еще есть?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578997
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicочень много процедур добавилось
Процедуры btnContinueClick, btnSkipClick, btnStopClick легко превращаются в одну с помощью Tag
BellicНу и вопрос - в принципе, обязателен ли тут был Поток?
Любую задачу можно решить в одном потоке. Иногда это идеальный вариант. Но ты же хранишь условие задачи в секрете, откуда я знаю.
BellicБез него - какие варианты еще есть?
Только такие, которые будут тормозить интерфейс.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578999
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
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
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579000
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bellic, на форму кидаешь панельку с тремя (или сколько нужно кнопками), делаешь её не активной, в фомре объявляешь переменную, например FRes: integer, а вместо Rez := MessageDlg вставляешь код
Код: pascal
1.
2.
3.
4.
Panel.Enable := True;
FRes := 0;
while FRes = 0 do Application.ProcessMessages;
Panel.Enable := False;

При этом в обработчиках кнопок FRes присваиваешь нужное значение.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579001
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockПроцедуры btnContinueClick, btnSkipClick, btnStopClick легко превращаются в одну с помощью Tag
Это понятно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;

...
Рейтинг: 0 / 0
25 сообщений из 110, страница 3 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обработка нажатия трех кнопок в параллельном потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]