powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обработка нажатия трех кнопок в параллельном потоке
25 сообщений из 110, страница 2 из 5
Обработка нажатия трех кнопок в параллельном потоке
    #39578835
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикХотя. Ты используешь модуль System.SysUtils ????
Ну в шапке кода написано - я код свой проверенный, рабочий выложил!

У Вас возможно реализация красивее с CASE выглядит, но я свой Тестовый писал не на выставку, а чтоб понятней было что-куда!
Посему - не придирайтесь так уж!
Для меня важнее было совсем другое!

И всеж - я не понимаю, почему Функция в перемешку с Процедурой???
Может всеж правильнее было так(?):
Код: 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.
function IndexIArray(const str: string; const arr: TArray<string>): Integer;
  var
    I: Integer;
  begin
    for I := Low(arr) to High(arr) do
      if str.ToLower = arr[I].ToLower then
        exit(I);
  end;
//------------------------------------------------------------------------------
procedure TMainForm.AllButtonClick(Sender: TObject);
var
  obj: TButton;
begin
  obj := TButton(Sender);
  if not SButtonEnebled then
  begin
    if obj.Name = 'SButton' then
      SButtonEnebled := true
    else
      MMemo.Lines.Add('Кряя. Надо нажать на SButton');
    exit;
  end;

  case IndexIArray(obj.Name, ['Button1', 'Button2', 'Button3']) of
    0:
      begin
        MMemo.Lines.Add('Нажата кн."Продолжить"');
      end;
    1:
      begin
        MMemo.Lines.Add('Нажата кн."Пропустить"');
      end;
    2:
      begin
        MMemo.Lines.Add('Счет Остановлен!');
      end;
    3:
      begin
        Exit;
      end;
  end;
  SButtonEnebled := False;
end;

И следующие две строчки - исправьте согласно правил Дэлфи!
Код: pascal
1.
2.
if str.ToLower = arr[I].ToLower then
        exit(I);

...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578836
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AllButtonClick - процедура клика на каждую из кнопок?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578837
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик , для меня было важно...эээ, попробую выразиться правильным языком:
- важно было то, что передача флагов вполне возможна в Рун-Тайме основного цикла процедуры, при этом процедуры обработки кликов по клавишам отработали как-бы параллельно, выполнив всего лишь одну операцию FlagХ:=True;
Остальной анализ и разветвления - уже опять в основной процедуре цикла!

Все остальное - мелочи вариантов реализации!

И еще - Вы не правильно сделали! Ваши "MMemo.Lines.Add" в CASE отработали в обработчике нажатия клавиш, а Основная процедура осталась без результата нажатия! А для меня именно это нужно было!
Можно конечно вместо "MMemo.Lines.Add" написать "FlagХ:=True;", а уже в основной процедуре анализировать их и выполнять нужную ветку. Но все ж!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578838
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicAllButtonClick - процедура клика на каждую из кнопок?

Верно.

Bellicа чтоб понятней было что-куда!

А вышло так, что всех запутал. Неправильно реализованной задачей.

BellicФункция в перемешку с Процедурой???

Она не в перемешку, она в своей области видимости.
Т.е в общей области недоступна.


BellicИ следующие две строчки - исправьте согласно правил Дэлфи!

Не понмиаю, что у вас не так. Всё по стандартам record helper for
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578839
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Зачем нужны какие то флаги???

Почитайте о компоненте ApplicationEvents и установите нормальный обработчик для клавиш нажатых

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

Она не в перемешку, она в своей области видимости.
Т.е в общей области недоступна.Понятно! Просто меня несколько это смутило. Ничего что я ее вывел отдельно?

Не понмиаю, что у вас не так. Всё по стандартам record helper for
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578841
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicЧто не так?


Описанием задачи.

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

Почитайте о компоненте ApplicationEvents и установите нормальный обработчик для клавиш нажатыхА вот за подсказку - при много благодарен! Но похоже изучать и смотреть - пригодиться ли оно мне - уже буду утром!..)))
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578845
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicважно было то, что передача флагов вполне возможна в Рун-Тайме основного цикла процедуры, при этом процедуры обработки кликов по клавишам
Это не основной цикл, а дополнительный и полностью бессмысленный.
Основной крутится внутри Application.Run - нормальный цикл, ожидающий события получения сообщения, а не хрень со Sleep и ProcessMessages.

Тебе не нужны ни флаги ни цикл. Назначь кнопкам один обработчик (в object inspector на вкладке events) - это и будет твоя "процедура".
И установи им разное значение свойства Tag (в object inspector на вкладке properties). Это и будут твои флаги.

И в этой своей "основной процедуре" просто пиши
if TButton( Sender ).Tag = 2 then...
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578846
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не благодари. Поставь компонент ApplicationEvents и на него событие onMessage

Код: 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.
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    SButton: TButton;
    Memo1: TMemo;
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  private
    SButtonEnebled: Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);

var
  ActiveHandle, idx: NativeInt;
  str: string;
  function IndexIArray(const str: Integer; const arr: TArray<Integer>): Integer;
  var
    I: Integer;
  begin
    for I := Low(arr) to High(arr) do
    begin
      ActiveHandle := arr[I];
      if str = ActiveHandle then
        exit(I);
    end;
    ActiveHandle := 0;
  end;

begin
  if Msg.message = 513 then
  begin
    idx := IndexIArray(Msg.hwnd, [Button1.Handle, Button2.Handle,
      Button3.Handle, SButton.Handle]);

    if not SButtonEnebled then
    begin
      if ActiveHandle = SButton.Handle then
        SButtonEnebled := true
      else
        Memo1.Lines.Add('Кряя. Надо нажать на SButton');
      exit;
    end;

    case idx of
      0:
        begin
          Memo1.Lines.Add('Нажата кн."Продолжить"');
        end;
      1:
        begin
          Memo1.Lines.Add('Нажата кн."Пропустить"');
        end;
      2:
        begin
          Memo1.Lines.Add('Счет Остановлен!');
        end;
      3:
        exit;
    end;
    SButtonEnebled := false;
  end
  else if Msg.message = 257 then
  begin
    Memo1.Lines.Add('Нажата кнопка: ' + chr(Msg.wParam));
  end;

end;

end.

...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578847
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшой фикс
Код: pascal
1.
2.
3.
   end;
    ActiveHandle := -1;
  end;
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578870
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, ты знаешь толк в извращениях.
Массив, поиск в нем по имени...и все это вместо того, чтобы трем кнопкам проставить Tag от нуля до двух, и сверяться с ним.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578875
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшику, по последнему коду: TArray<Integer>, надежнее массив NativeUInt'ов, быстрее и проще TArray.BinarySearch, хотя в случае четырёх членов, думаю, пофиг.
YuRockЭто не основной цикл, а дополнительный и полностью бессмысленный.
Я так понимаю, что у него всё крутится в одном потоке и ему нужно как-то 'придержать' работу кода до нажатия на кнопки, которые находятся на форме.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578876
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

+1, проще case по тэгу. для четырёх то кнопок )
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578877
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много думал, почему няшик так хитро делает. То названия, то зачем-то хендлы (причем не совсем верно - handle не integer ни разу, можно нарваться на глюки). Почему не просто tag? Боюсь, няшик, что картинку, которую ты постил, можешь применить и к себе
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578878
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, за деревьями леса не видно, как обычно :) Мой хрустальный шар выдал следующее. ТСу нужно что-то считать. Потом остановить счет, дождаться реакции нажатия на кнопку на этой же форме, где идёт расчет, и дальше продолжить, возможно в зависимости от того, что нажали. Если 'расчет' довольно быстрый, то, думаю, можно попробовать основным потоком обойтись. В общем - ждём пока нормального описания того, что нужно. Иначе можно долго гадать.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578890
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикНе благодари. Поставь компонент ApplicationEvents и на него событие onMessage
Код: pascal
1.
2.
idx := IndexIArray(Msg.hwnd, [Button1.Handle, Button2.Handle,
      Button3.Handle, SButton.Handle]);

[dcc32 Error] Main_Module.pas(166): E2010 Incompatible types: 'System.TArray<System.Integer>' and 'Set' !!!

Возможно я не прав, Няшик , а Ваша процедура через себя все События Windows будет пропускать?
Может для начало нужно было отловить нажатие левой кнопки мыши (WM_LBUTTONDOWN), а потом проанализировать - а не по нужной ли кнопке мацнул юзер? Или из WM_COMMAND можно сразу Хэндл кнопки узнать?!
Я не иронизирую вовсе, просто в этих делах мало пока понимаю! Посему - убедительно прошу, проверяйте свой код перед публикацией и желательно с компиляцией - не хочется искать ошибки в чужих творениях!
Кстати - Вы привели обработчик событий, а что же в это время будет делать основной цикл в Осн.процедуре? Я про вот это имел ввиду:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
while True do
          begin
               for i := 0 to 10 do
                     begin
                        ...
                     end;
          end;


makhaonЯ так понимаю, что у него всё крутится в одном потоке и ему нужно как-то 'придержать' работу кода до нажатия на кнопки, которые находятся на форме.Браво!!! Совершенно верно! я вроде так и объяснял, не вдаваясь в подробности, даже Тестовый код приближенный к реальному воспроизвел!
Только маленькое уточнение! - Не "придержать работу", а после выбора юзером - продолжить выполнение по алгоритму, пропустить его часть или выйти с сохранением результата, полученного на это время.

makhaonТСу нужно что-то считать. Потом остановить счет, дождаться реакции нажатия на кнопку на этой же форме, где идёт расчет, и дальше продолжить, возможно в зависимости от того, что нажали. Если 'расчет' довольно быстрый, то, думаю, можно попробовать основным потоком обойтись.И тут - Ваш хрустальный шар правильно предсказал!..)))

makhaonВ общем - ждём пока нормального описания того, что нужно. Иначе можно долго гадать.Уже и не знаю, как упростить описание "Задания", что бы не грузить лишней информацией!? Ну не всю же процедуру сюда реальную копировать?
Есть предложение - давайте я попробую еще раз сформулировать задачу, но пусть это будет уже Новый топик, ибо этот звучит как "Обработка нажатия трех кнопок в параллельном потоке", а о потоках вроде как уже не говорим!
Модераторы могут возмутиться!
Иль тут продолжить?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578893
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rМассив, поиск в нем по имени...и все это вместо того, чтобы трем кнопкам проставить Tag от нуля до двух, и сверяться с ним.
Можно даже проще.
Код: pascal
1.
if Sender = Button2 then
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578894
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicУже и не знаю, как упростить описание "Задания", что бы не грузить лишней информацией!? Ну не всю же процедуру сюда реальную копировать?
Нет, процедуру не надо уже, упаси бог. Нужно "Задание" сюда скопировать.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578895
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Понятно, я так и думал. Можно попробовать сделать так:
1. Считаем всё до момента необходимости выбора.
2. Включаем visible, либо, лучше, делаем enable кнопкам.
3. Ждём безо всяких циклов когда юзер нажмёт какую-то кнопку.
4. В обработчиках OnClick кнопок развешиваем остальные куски кода, в зависимости от того, что нажмут.
Согласен, что батонокидательство. Но, думаю, в этом случае, допустимое.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578896
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockМожно даже проще.
Код: pascal
1.
if Sender = Button2 then

Не пойму - зачем лишние проверки и массивы?
Чем плох код из этого сообщения?
Тем, что на каждой из кнопок - мизерный обработчик висит? - Возможно можно написать и Общий обработчик для трех кнопок, но тогда внутри него придется развернуть анализ...(
Или Три флага смущают?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578900
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicно тогда внутри него придется развернуть анализ
Это именно этот анализ:
Код: pascal
1.
if Flag2=True then begin


И, это, еще так можно писать, чтоб точно враги не догадались:
Код: pascal
1.
if (Flag2=True)=True then begin



(это я к тому, что булево значение уже не надо сравнивать с True, вообще не надо ни с чем сравнивать, оно готово для использования в условиях - if Flag2 then)
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578902
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Плох Application.ProcessMessages + Sleep. Тем, что занимает ресурсы, сильно ухудшает отзывчивость программы, заставляя основной поток спать, потенциально может привести к трудноуловимым багам.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578903
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicзачем лишние проверки и массивы?
Т.ч. проверок столько же, только лишних переменных, обработчиков и логики меньше.
А зачем массивы - я тоже не знаю.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578905
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторно тогда внутри него придется развернуть анализ

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

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



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


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