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

Попробую словесно описать суть задачи

- Имеется форма и Основная процедура, которая производит какие-то вычисления
- на форме кроме разных полей, имеется Три кнопки: " Заменить ", " Пропустить " и " Выход "
- в определенный момент Основной процедуре нужно передать определенные значения или пустить ее по одному из трех направлений, в зависимости от выбора пользователя из трех кнопок.

Сразу скажу - по определенным причинам, применение Диалоговых окон мне не подходит!

Реализацию алгоритмически вижу примерно так:
- внутри Основной процедуры в Осн.потоке пишем бесконечный цикл с анализом внутри трех Флаг-переменных - например Zamena , Propusk , Vihod : Boolean ;
- перед этим бесконечным циклом запустить Доп.поток с тремя процедурами обработки клика на соответствующие клавиши, внутри каждой из которых будут меняться Флаг-переменные;
- т.о. получив нужные флаги внутри бесконечного цикла, Осн.поток останавливает Доп.поток и продолжает выполнение Основной процедуры.

По моему - сей алгоритм можно реализовать с помощью потоков!?
Может быть кто либо уже реализовывал его или есть похожие варианты кода?!

P.S. По случаю - поздравляю всех форумчан и Администрацию с наступающим 2018 годом!!!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578411
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic- внутри Основной процедуры в _Осн.потоке_ пишем бесконечный цикл с анализом внутри трех
Флаг-переменных - например *Zamena*, *Propusk*, *Vihod*: *Boolean*;
- перед этим бесконечным циклом запустить _Доп.поток_ с тремя процедурами обработки клика
на соответствующие клавиши, внутри каждой из которых будут меняться Флаг-переменные;

Наоборот. Всем GUI и в том числе кнопками должен заниматься исключительно основной поток.
Дополнительный поток - делает всю продолжительную работу, подчиняясь командам из основного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578415
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovНаоборот. Всем GUI и в том числе кнопками должен заниматься исключительно основной поток.
Дополнительный поток - делает всю продолжительную работу, подчиняясь командам из основного.

И что мешает Три процедуры обработки нажатия кнопок написать в отдельном модуле, запустить в Доп.потоке, а в Основном - закрутить в цикле анализ Флагов?
Т.е. как я описал - не получится сделать?
Я просто хочу отказаться от отдельного Диалогового окна в Осн.процедуре, а кнопки разместить на форме!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578416
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я видимо понял!
Создав Доп.поток нужно в нем запустить какую-либо процедуру, а в моем алго - лишь три обработчика нажатия клавиш!?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578417
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicа в Основном - закрутить в цикле анализ Флагов?В основном потоке и так беспрерывно крутится цикл обработки сообщений. Зачем еще один?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578419
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockВ основном потоке и так беспрерывно крутится цикл обработки сообщений. Зачем еще один?
Цикл анализа реакции выбора Юзера, цикл опроса Флаговых переменных...
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578420
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведь когда вызывается обычное Диалоговое окно - с момента его Вывода на экран и до нажатия кнопок - тоже ведь внутри идет цикл опроса клавиш, по сути!?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578421
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock Зачем еще один?
YuRock , предложи тогда свой вариант - отказа Диалог.окон и переноса кнопок на основную форму!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578422
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicЦикл анализа реакции выбора ЮзераДля этого существуют события баттонклики. По сути - орабатываются сообщения wm_command.


Bellicцикл опроса Флаговых переменных...
Вот его и запихни в доппоток, и при изменении - кидай сообщение основному, что надо что-то изменить в отображении.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578423
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой-то поток сознания.

Работа делается в отдельном потоке.

Хоткеи срабатывают в основном окне, в обработчике делаются нужные действия с "рабочим" потоком.


Проблема-то в чем?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578424
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicВедь когда вызывается обычное Диалоговое окно - с момента его Вывода на экран и до нажатия кнопок - тоже ведь внутри идет цикл опроса клавиш, по сути!?Это только в VCL такая костыльноглючная технология используется для модальности.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578426
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockВот его и запихни в доппоток, и при изменении - кидай сообщение основному, что надо что-то изменить в отображении.
Этого нельзя сделать!
В Основной процедуре открыта куча файлов, задействовано много циклов и переменных, процедура еще выполняется, просто в ОДИН момент нужен выбор юзера, и все!!! Все решается обычным Диалоговым окном!!!
Но мне Диалог не подходит!!!
Необходимо, что бы кнопки принятия решения были на самой форме!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578428
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicЭтого нельзя сделать!
В Основной процедуре открыта куча файлов, задействовано много циклов и переменных, процедура еще выполняется, просто в ОДИН момент нужен выбор юзера, и все!!!Именно по этому и надо всё это перенести в доп поток, раз много работы.

А выбор юзера сделать перед началом этой работы. Ведь это же бред, когда юзер должен 10 минут сидеть ждать, пока программа его попросит сделать выбор.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578432
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockBellicЭтого нельзя сделать!
В Основной процедуре открыта куча файлов, задействовано много циклов и переменных, процедура еще выполняется, просто в ОДИН момент нужен выбор юзера, и все!!!Именно по этому и надо всё это перенести в доп поток, раз много работы.

А выбор юзера сделать перед началом этой работы. Ведь это же бред, когда юзер должен 10 минут сидеть ждать, пока программа его попросит сделать выбор.
Юзер не будет ждать!
Даже наоборот - ему придется быстро оценивать промежуточные результаты в Эдитах и прочих полях, и нажимать нужную кнопку!
Именно по этому я хочу и отказаться от Диалогового окна, ибо оно закрывает собой часть осн.формы, передвинут его в сторону в ручную - потерять время! Программно разместить например в углу экрана - тоже не вариант - отвлечение внимания юзера и т.п.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578454
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicЮзер не будет ждать!Не понятно тогда, зачем другой поток.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578473
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

не убеждай его, бесполезно. Клиент должен дозреть.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578814
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.
unit Main_Module;

interface

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

type
  TMainForm = class(TForm)
    SButton: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    MLabel: TLabel;
    MMemo: TMemo;
    procedure SButtonClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    Flag1, Flag2, Flag3: Boolean;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
procedure TMainForm.Button1Click(Sender: TObject); // Кнопка "Продолжить" счет
begin
     Flag1:=True;
end;
//------------------------------------------------------------------------------
procedure TMainForm.Button2Click(Sender: TObject); // Кнопка "Пропустить" счет
begin
     Flag2:=True;
end;
//------------------------------------------------------------------------------
procedure TMainForm.Button3Click(Sender: TObject); // Кнопка "Остановить" счет
begin
     Flag3:=True;
end;
//------------------------------------------------------------------------------
procedure TMainForm.SButtonClick(Sender: TObject); // Кнопка "Запустить" счет
var
i: Integer;
label
Metka;
begin   MMemo.Lines.Add('Счет запущен');
     while True do
          begin
               for i := 0 to 10 do
                    begin
                         MLabel.Caption := IntToStr(i);
                         Application.ProcessMessages;
                         Sleep(500);
                         if i=5 then
                              begin
                                   MMemo.Lines.Add('Продолжаем цикл? Нажмите одну из Кнопок!');
Metka:                             Application.ProcessMessages; //==============
                                   if Flag1=True then begin
                                        MMemo.Lines.Add('Нажата кн."Продолжить"');
                                        Flag1:=False;
                                        Continue;
                                        end;
                                   if Flag2=True then begin
                                        MMemo.Lines.Add('Нажата кн."Пропустить"');
                                        Flag2:=False;
                                        Break;
                                        end;
                                   if Flag3=True then begin
                                        MMemo.Lines.Add('Нажата кн."Остановить"');
                                        Flag3:=False;
                                        MMemo.Lines.Add('Счет Остановлен!');
                                        Exit;
                                        end;
                                    goto Metka; //==============================
                              end;
                    end;
          end;
end;
//------------------------------------------------------------------------------
end.

Можете меня расстрелять, но Он прекрасно работает!..)))
Возможно будут замечания и к Тестовому коду, к циклам или же к "GOTO"-переходу, но тут важна сама суть - пока процедура "крутится" в цикле между МЕТКА-ми (выделено желтым цветом), анализируя три флага, пользователь приняв решение может нажать одну из 3-х кнопок.

P.S. Поиски в Интернете показали другой вариант - с анализом WM_LBUTTONDOWN, или WM_COMMAND, а потом чтением и анализом Хэндла кнопки... но у меня пока так и не получилось его реализовать.
В этом случае по моему можно было вообще обойтись без отдельных процедур - обработчиков нажатия кнопок!?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578821
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто нибудь мне - умственно отсталому человеку объяснить....

На кой чёрт потоки и бесконечные циклы????

Можно же было всем объектам назначить коллбэк один, или вызов доп коллбэка.

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

Лучше напишите реально работающий свой вариант с "одним коллбэком"..))
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578826
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
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)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    SButton: TButton;
    Memo1: TMemo;
    procedure AllButtonClick(Sender: TObject);
  private
    SButtonEnebled: Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AllButtonClick(Sender: TObject);
  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;

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

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

end.

...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578827
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Вообще, судя по Sleep(500) - там запланировано выполнение чего-то длительного, поэтому почти всё что в процедуре ".SButtonClick()" нужно вынести в отдельный поток и уже из него анализировать состояние этих флагов.

А вообще, бесконечные циклы, да ещё и со Sleep() в ГУИ потоке - не надо так, пользователи вас за подвисающий интерфейс будут очень долго любить... часто вспоминать... малым загибом... ну и так далее.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578830
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpВообще, судя по Sleep(500) - там запланировано выполнение чего-то длительногоSleep(500) - это задержка, чисто в тестовом коде, чтоб счет был не таким быстрым!.)))

поэтому почти всё что в процедуре ".SButtonClick()" нужно вынести в отдельный поток и уже из него анализировать состояние этих флагов.Зачем еще поток? И так ведь все работает?

А вообще, бесконечные циклы, да ещё и со Sleep() в ГУИ потоке - не надо так, пользователи вас за подвисающий интерфейс будут очень долго любить... часто вспоминать... малым загибом... ну и так далее.Тестовая программа - не зависает, а Пользователи - исключительно только я, ну может с друзьями поделюсь!..))
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578831
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, уточните плизз код вот тут:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm1.AllButtonClick(Sender: TObject);
  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);
        ....


Начинается процедура, затем Функция... а вот
Код: pascal
1.
if str.ToLower = arr[I].ToLower then

моя DX вообще не поняла!
У Вас ваш код работает?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578832
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта функция нужна, что бы найти в массиве индекс элемента. Дабы, что бы по этому индексу обратится к коллекцию case по нужному адресу.


Код полностью рабочий, и никаких задержек не надо.

Хотя я кое что не дописал. Надо ещё в case добавить 3 пункт (3: exit;), дабы при нажатии второй раз кнопки SButton не вылетал флаг в false
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39578833
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя. Ты используешь модуль System.SysUtils ????
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #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
Обработка нажатия трех кнопок в параллельном потоке
    #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
Обработка нажатия трех кнопок в параллельном потоке
    #39579015
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicМожете меня расстрелять, но Он прекрасно работает!..)))
Попробуй, пока он работает, нажать, скажем, крестик в правом верхнем углу.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579024
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Freedoom , очень интересно получилось! Класс!
(Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!)
Архив проекта прилагается ...)
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579026
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic Freedoom , очень интересно получилось! Класс!
(Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!)
Жаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579029
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerПопробуй, пока он работает, нажать, скажем, крестик в правом верхнем углу.Ничего не произошло, и по крайней мере от Крестика я буду избавляться вообще!
Ну нельзя закрывать окно посредине открытого цикла!
Но это уже мелочи и совсем другая история...
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579032
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicНу нельзя закрывать окно посредине открытого цикла!Даже если пользователь передумал ждать окончания твоего цикла?
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579034
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockЖаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого.
Тормозов не наблюдается, а скачек нагрузки на CPU - c 25 до 50%. Это много?
Можно если захочется - таймером ворон на ветках посчитать!..)))
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579035
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockДаже если пользователь передумал ждать окончания твоего цикла?Выход из процедуры будет возможен только по кнопке Выход, с корректными действиями.
А сам расчет (в Тестовом варианте - это счет от 0 до 500 и от 501 до 1000 и т.д.) в Реальном цикле выполняется достаточно быстро, так что юзер и не успеет мышкой на Крестик навести (Если он его еще сумеет найти на форме)!..)
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579037
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicа скачек нагрузки на CPU - c 25 до 50%. Это много?
Значит у тебя 4 процессора (ядра). На одном уже "работала" подобная "программа", а эта запустилась на другом.
А если бы было одно ядро - нагрузка была бы 100.
Но не отчаивайся, и на многоядерных компьютерах, все программы, GUI-поток которых работал на том процессоре, который ты отправил в кому, будут тормозить.
Много это или не много - пользователям твоей программы решать.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579040
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockЗначит у тебя 4 процессора (ядра). На одном уже "работала" подобная "программа", а эта запустилась на другом.
А если бы было одно ядро - нагрузка была бы 100.
Но не отчаивайся, и на многоядерных компьютерах, все программы, GUI-поток которых работал на том процессоре, который ты отправил в кому, будут тормозить.
Много это или не много - пользователям твоей программы решать.Да, верно, у меня 4 ядра!..)
С Одним ядром - это Pentium-1 что ли? Так мой уже такой давно на свалке!..))
А программа реальная - для узконаправленного круга пользователей пишется - для себя, ну максимум еще может для 2 -х других друзей!

Ну а будут тормоза - можно и твоим Потоковым вариантом воспользоваться! - Он судя по индикатору - вообще не грузит процессор!..)
Надеюсь проблем, обращения из Потоковой процедуры к другим функциям и процедурам, не должно быть?!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579043
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicС Одним ядром - это Pentium-1 что ли?
В твоём случае, если б у тебя было 2 ядра, оба стали б заняты (т.к. 1-е уже кто-то занял).
Не, если не жалко электроэнергии и нервов, плевать на прокляться благодарных пользователей - я ж не против.

BellicПотоковой процедуры к другим функциям и процедурам, не должно быть
Функциям и процедуры, как и память, не принадлежат какому-то потоку. Их можно использовать из любого.
Только поток кода будет хоть и одинаков, если вызывать одну функцию в разных потоках, но их будет несколько, а вот память - одна на всех.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579044
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicскачек нагрузки на CPU - c 25 до 50%. Это много?

Это полный П. У правильно написанной программы в покое должно быть нулевое потребление ЦПУ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579045
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock , Кстати - добавил Sleep(1); в ЭТОТ КОД , и процент загруженности вообще упал, проверь:
Код: pascal
1.
2.
3.
4.
5.
while FRes = 0 do
begin
  Sleep(1);
  Application.ProcessMessages;
end;


- Без Sleep(1) -- 25-27% в ожидании нажатия клавиш;
- Со Sleep(1) -- загрузка в ожидании практически не увеличилась (1-5%)!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579048
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем дальше фигнёй страдать??)) А вот воспользовались бы таймером, даже в потоке. То не пришлось бы заниматься такими оптимизациями)))
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579052
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тем более, applicationevents сообщит о нажатии клавиши. И вообще не надо никаких собственных крутых for-ов
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579054
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

А теперь попробуй закрыть программу крестиком.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579059
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic YuRock , Кстати - добавил Sleep(1); в ЭТОТ КОД , и процент загруженности вообще упал, проверь:
Код: pascal
1.
2.
3.
4.
5.
while FRes = 0 do
begin
  Sleep(1);
  Application.ProcessMessages;
end;



- Без Sleep(1) -- 25-27% в ожидании нажатия клавиш;
- Со Sleep(1) -- загрузка в ожидании практически не увеличилась (1-5%)!
Не хочу я пробовать
Это мрак. Что со слипом, что без.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579061
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatBellic, А теперь попробуй закрыть программу крестиком. rgreat , Вы похоже Тему вообще не читаете!?
ВОТ ТУТ я уже ответил на этот вопрос!
Ну нету у меня на Реальной форме КРЕСТИКА!!! На Тестовой форме он конечно имеется, но я не буду туда нажимать!
Я форму создавал сразу без крестиков, значков сворачивания и минимизаций! Что бы потом вопросов не было!..)
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579066
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Беллик, сделай нормально, правда :) Тебе же самому будет лучше и проще потом. Не надо потоков бояться, всё там с ними просто, если один раз разобраться. ProcessMessages - это, как правило, костыль, хоть со слипом, хоть без. Рано или поздно он гарантированно вылезет боком. Причём в таком месте, что вообще никак не связано напрямую с кодом. И вот тогда всю голову сломаешь, почему глючит.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579067
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикПродолжаем дальше фигнёй страдать??)) А вот воспользовались бы таймером, даже в потоке. То не пришлось бы заниматься такими оптимизациями)))А кто Вам мешает написать свой вариант на основе моего Тестового и приложить к сообщению полный рабочий проект(без ошибок ток)?
Тем более, applicationevents сообщит о нажатии клавиши. И вообще не надо никаких собственных крутых for-ов
Няшик , мне на пиво братишка позвал, к сожалению вернусь только завтра, но я хотел бы Заценить и Ваш вариант с Таймером и Эвентсами!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579071
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

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

А что касается ProcessMessages , то я им и в других затяжных процедурах пользуюсь, чтоб избавиться от "Программа не отвечает"(или как там?) в шапке форм! А как по другому этого избежать?
Вот недавно сравнительно узнал, что можно ProgressBar.Refresh делать!
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579078
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дивлюсь я вам, мужики. Вместо того, чтобы доедать оливье и в телик пялиться, вы домашку школьнику, пересевшего с бейсика на паскаль, делаете. Да и еще с ним аргументированно спорить пытаетесь
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579079
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Не знаю, как кто, я уже оливье с шубой объелся Хватит, надо калории немного потратить ) Пациент не совсем упоротый, шансы есть.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579084
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

У меня всё без ошибок работает. Ошибки делаешь ты...

Это задача вообще на 10 - 20 минут в реализации.

Может бы начал с чего нибудь полегче ????


НяшикЦиклы к слову вообще не нужны, уже есть 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
Обработка нажатия трех кнопок в параллельном потоке
    #39579086
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Я уже поправился на 8 кг... Тяжело ходить даже стало xD
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579089
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicизбавиться от "Программа не отвечает"(или как там?) в шапке форм! А как по другому этого избежать?
Делать тяжелую работу в другом потоке.

BellicВот недавно сравнительно узнал, что можно ProgressBar.Refresh делать!
Не надо вызывать, если делать работу в другом потоке. Именно из-за того, что ты с помощью костылей пытаешься делать и работу и отрисовку интерфейса, у тебя и получается эффект, обратный

Bellicкод очень коротким получался ведь!?
Более того, ты вызовом принудительной отрисовки (ProgressBar.Refresh и подобного) замедляешь работу основного своего алгоритма, который ты называешь "циклом".
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579097
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicкод очень коротким получался ведь!?
Да, и еще. Мой код (с потоком) на 5 с половиной строк больше твоего потому, что я предусмотрел для пользователя возможность в любой момент корректно и сразу закрыть программу.
Если уважение к пользователям не нужно - можно убрать оттуда некоторые проверки, кое-где Wait заменить на Sleep, работать по FreeOnTerminate=True, и еще много чего.

Уверяю тебя, что код с потоком получится меньше, чем у тебя (хотя бы потому, что нет goto в основном алгоритме). И будет висеть при нажатии на крестик, пока не закончится "цикл", как ты любишь.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579114
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockBellic Freedoom , очень интересно получилось! Класс!
(Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!)
Жаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого.
Если речь идёт об экономии электроэнергии на время обдумывания выбора варианта ответа пользователем, то никто не мешает глянуть на реализацию ShowModal в первоисточниках и переделать цикл
Код: pascal
1.
2.
3.
repeat
  Application.HandleMessage;
until (FRes <> 0) or Application.Terminate;
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579133
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoomпеределать цикл
Код: pascal
1.
2.
3.
repeat
  Application.HandleMessage;
until (FRes <> 0) or Application.Terminate;

Это уже лучше, хотя и все равно мрак.
И это не первоисточники, а такие же костыли и грабли.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579178
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock, см реализацию ShowModal в vcl.forms.pas
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579182
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomYuRock, см реализацию ShowModal в vcl.forms.pasЯ её смотрел уже раньше. Костыли и грабли.
Такой подход иногда допустим, когда действительно надо быстро вставить костыль в готовую рабочую систему, и другого выхода нет, кроме как всё переделывать, что может быть не выгодно.
Но заложить такое в основу библиотеки... Я когда первый раз наступил на это и увидел в чем проблема... Такого я от Борланда не ожидал.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579207
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockТакого я от Борланда не ожидал.

По моему они уже скатились, и сейчас выпускают что бы была активность для продаж
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579208
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, ты будешь удивлен, но Борланда уже почти 10 лет как не существует.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579259
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикYuRockТакого я от Борланда не ожидал.

По моему они уже скатились, и сейчас выпускают что бы была активность для продажКод ShowModal не менялся больше 20 лет.
...
Рейтинг: 0 / 0
Обработка нажатия трех кнопок в параллельном потоке
    #39579474
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет Сиквелцам!
Не хочется никого отвлекать пустыми разговорами - для себя оценил вариант YuRock -ка, поэтому буду внедрять Поток в свою прогу!
Единственное - хотелось бы увидеть полностью законченный вариант от Няшик -ка на Events!
Кнопки у него на форме имеются, а счет - отсутствует!
Няшик , допиши плизз...))

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


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