powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Функция, ожидание значения переменной
25 сообщений из 62, страница 2 из 3
Функция, ожидание значения переменной
    #39479836
Фотография Ryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57, чтобы программа не считалась "мёртвой", если лицензии долго не будет.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479842
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда, учитывая это:
RyuuИ это не та программа, где "подвисание" кому-то критично. Им нужно нажать на кнопку и ждать, когда программа выполнится.совсем не понятно, зачем так делать. Как уже выше написали могут быть проблемы с отменой подвисшего ожидания.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479845
Фотография Ryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57, какого рода проблемы? Как раз без этой функции и могут быть проблемы в стиле "программа не отвечает", хотя на самом деле работает, или же я чего-то путаю?
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479849
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RyuuКак раз без этой функции и могут быть проблемы в стиле "программа не отвечает", хотя на
самом деле работает, или же я чего-то путаю?

Похоже, ты этот кусок вообще не тестировал. А зря.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479861
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ryuu, зайдем с другой стороны: а возможность отмены длительного ожидания лицензии планировалась в приложении?
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479899
Leo Pevzner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ryuu,

Есть 2 вида людей. Одни уже бэкапятся, а другие еще нет. (с)

Зачем вы интересуетесь мнением коммьюнити, если не хототе к нему прислушаться?
Вам прямым текстом сказали, что так делать не надо и намекнули почему. Вопрос немного более глубок, чем кажется на первый взгляд. Но если вам хочется пройти долгим путем - да пожалуйста.... Может быть кто-то следующий прочтет этот топик, задумается и это принесет ему пользу...
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479904
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Pevzner,

Удивляюсь упорству людей делать костыли ) При том, что нормальное решение делается в несколько строк или несколько кликов.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479907
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

сделай решение для автора в несколько кликов/строк, раз это так просто.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479917
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDimakhaon,
сделай решение для автора в несколько кликов/строк, раз это так просто.
Делать не буду, но на вскидку: маленькая формочка "ожидание лицензии" с кратким описанием, одной кнопкой "отмена" и таймером на 200-500 мсек, в котором проверяется значение переменной, и по результату выставляется mrOk. "Отмена" соотв-но выставляет mrCancel. Причём если автор уверен, что получение лицензии в 9 случаях из 10 очень быстрое, то можно сделать что-то вроде (псевдокод):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WaitStep := 0;
while (License <= 0) and (WaitStep < 10) do begin
  Inc(WaitStep);
  Sleep(100);
end;
if License <=0 then begin
  with TWaitForm.Create(Self) do try 
    if ShowModal <> mrOk then begin
      // что-то пошло не так и пользователю надоело ждать лицензию.
      Exit;
    end;
  finally
    Free;
  end;
end;
// тут у нас уже есть лицензия


Таким образом будет "залипание" приложения на одну секунду и если за эту секунду лицензия не "прокнет", то будет отображено окно ожидания.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479918
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда там предполагается, что значение License меняется где-то в другом потоке. Если в этом же, то лучше сразу форму с таймером.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479919
А что если он уже показал формочку, которая не закрывается, но в которой ожидание лицензии по предложенному автором методу, как в этом случае ему может навредить ProcessMessage?
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479927
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да вы задолбаликак в этом случае ему может навредить ProcessMessage?

Будет зря греть процессор.
В сочетании с Sleep() вызовет состояние "Not responding" со всеми вытекающими вплоть до
автоматического убиения приложения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479934
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

И к этих 20 строкам кода надо еще прибавить код самой многопоточной формы ожидания. Все это проверить и протестировать (не говоря уже про само написание кода). И всё это вместо одного простого вызова ProcessMessages из цикла. Возникает вопрос: если результат один и тот же, зачем платить больше (причем на пару порядков)?
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39479936
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDialekcvp,
И к этих 20 строкам кода надо еще прибавить код самой многопоточной формы ожидания.
Какой многопоточной? Какая отладка? Таймер на форме и две строчки в TimerOnTimer():
Код: pascal
1.
2.
3.
4.
if License > 0 then begin
  Timer.Enabled := False;
  ModalResult := mrOk;
end; 


Но вообще, можно писать правильно, а можно - быстро. Каждый выбирает для себя :)
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480013
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RyuuВажно и то, чтобы при A<1 программа просто ждала, пока A не будет больше 0;А кто эту переменную будет менять? Или функция GetXMLFreeLicenseCount может со временем возвратить другое значение? От чего это зависит?
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480031
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiсделай решение для автора в несколько кликов/строк, раз это так просто.

Всё уже сделано до нас, рекомендую посмотреть:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_the_Parallel_Programming_Library
http://proghouse.ru/programming/36-delphi-xe7-ppl
http://www.sql.ru/forum/1050286/

Или таймер на форму, на худой конец.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480046
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonнормальное решение делается в несколько строк или несколько кликов.
makhaonВсё уже сделано до нас, рекомендую посмотреть:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_the_Parallel_Programming_Library
http://proghouse.ru/programming/36-delphi-xe7-ppl
http://www.sql.ru/forum/1050286/

Или таймер на форму, на худой конец.
1 и 2. Ссылка на библиотеку (стороннюю/встроенную), которой даже нет в делфи 6 из первого поста;
3. Ссылка на сторонний класс под сотню строк кода в интернете ( привет gunsmoker'у и не в укор wadman'у);
4. Делфийский таймер (таймер, Карл!), который к многопоточному программированию относится не больше, чем ProcessMessages.

Т.е. решения в несколько строк/кликов, как выше декларировалось, просто не существует, и все-равно придется разбираться с кучей кода/библиотек (сторонних, причем) только ради того, что программа не зависала в "бесконечном" цикле. Хотя для этих целей имеется встроенное и простое в использование средство в виде ProcessMessages, которое было создано разработчиками делфи в т.ч. и для целей автора данного топика, цитирую : "In lengthy operations, calling ProcessMessages periodically allows the application to respond to paint and other messages."
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480060
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiХотя для этих целей имеется встроенное и простое в использование средство в виде ProcessMessages, которое было создано разработчиками делфи в т.ч. и для целей автора данного топика, цитирую : "In lengthy operations, calling ProcessMessages periodically allows the application to respond to paint and other messages."Это не отменяет того что эта функция есть суть - кривой костыль, причем с возможными неприятными побочными эффектами.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480061
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, те кто до сих пор пользует Delphi 6 - махровые мазохисты.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480070
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ryuu, в несколько кликов/строк - это просто:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TForm1.TestLicenseClick(Sender: TObject);
begin
 Enabled := False;
 Tag := GetTickCount() + 100500;
 Application.OnMessage := OnMsg;
 SetTimer(Handle, 0740, 1050, nil);
 Caption := 'Для отмены ожидания - Esc';
end;

procedure TForm1.OnMsg(var Msg: tagMSG; var Handled: Boolean);
begin
 if ( (Msg.message = WM_TIMER) and (Msg.wParam = 0740) )
  then Handled := ( ( License() ) or ( Tag < GetTickCount() ) )
  else Handled := ( (Msg.message = WM_KEYDOWN) and (Msg.wParam = VK_ESCAPE) );

 if ( Handled ) then begin
  Application.OnMessage := nil;
  KillTimer(Handle, 0740);
  Enabled := True;
  Caption := 'Ok';
 end;
end;


...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480076
просто я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leo PevznerRyuuLeo Pevzner,
пропущено...

Я чего-то не понимаю?

Да. Предположим, что во времы выполнения этого цикла, пользователь нажмет на крестик и приложение получит сообщение WM_CLOSE. Давайте подумаем, что после этого должно произойти?сработает OnClose, но форму закрыть не дадут, пока не завершится процедура, в которой исполняется цикл.

а если во время выполнения потока пользователь нажмёт на крестик?

так проблема-то в чём? в том, что очередь Messages заполнится, которые выполнить не дадут, пока не завершится цикл? так они же и обрабатываются
ни разу не встречал с этим проблем
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480119
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто яа если во время выполнения потока пользователь нажмёт на крестик?
Нет проблем, если проверять на закрытие приложения.

Как это делается с wcthread:
Код: 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.
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    WCThread1: TWCThread;
    TaskCheckLicense: TTask;
    Label1: TLabel;
    procedure TaskCheckLicenseExecute(const Sender: TTask; const Msg: Word; var Param: Variant);
    procedure FormCreate(Sender: TObject);
    procedure TaskCheckLicenseFinish(const Sender: TTask; const Msg: Word; const Param: Variant);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := 'Проверка лицензии...';
  // запускаем проверку лицензии в другом потоке
  TaskCheckLicense.Start;
end;

procedure TForm1.TaskCheckLicenseExecute(const Sender: TTask; const Msg: Word; var Param: Variant);
begin
  // проверяем лицензию, это другой поток
  Sender.WaitMs(5000); // ожидаем 5 сек
  //Param := 'Лицензия не прошла проверку.';
  Param := 'Лицензия прошла проверку';  // входной и выходной параметр, передается из Start и в Finish  
end;

procedure TForm1.TaskCheckLicenseFinish(const Sender: TTask; const Msg: Word; const Param: Variant);
begin
  // этот метод выполняется в основном потоке, получает результат из другого потока
  Label1.Caption := Param;
end;

end.

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

Ок, JaDi, тебе можно так писать :) ТСу тоже. Я же уже написал. Тому, кто хочет пройтись еще раз по граблям, по которым люди уже прошлись сто раз - флаг в руки.

Зачем ТСу Delphi 6 тоже покрыто мраком.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480229
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Проблема в том, что в данном случае дешевые гвозди предлагают забивать дорогим микроскопом.
...
Рейтинг: 0 / 0
Функция, ожидание значения переменной
    #39480260
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiПроблема в том, что в данном случае дешевые гвозди предлагают забивать дорогим микроскопом.
Тут вообще программист не нужен. Если купили ПО, то могут им пользоваться, не купили - не могут.
Логично?

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


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