Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.20;
Скачать: CL | DM;

Вниз

Аналог функции sleep() без прерывания работы приложения   Найти похожие ветки 

 
DeadAlice ©   (2010-11-25 11:08) [0]

Имеется следующий код в библиотеке ActiveX Library:

компонент.Connect
sleep(1000)

По итогу компонент, выполняющий метод Connect оказывается не коннект, так как выполняется синхронно и на момент проверки соединяться еще не успевает, а sleep() тормозит выполнение всей программы. Если его заменить, к примеру, на ShowMessage, то соединение успевает произойти.

Чем можно заменить sleep(), чтобы дать время компоненту соединиться?


 
Anatoly Podgoretsky ©   (2010-11-25 11:40) [1]

sleep, а время замерь с ShowMessage
Только это все неправильно.


 
DeadAlice ©   (2010-11-25 11:47) [2]

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

не работает, даже sleep(10000), что заметно дольше чем нажать кнопку в ShowMessage.


 
clickmaker ©   (2010-11-25 11:54) [3]

> как код должен линейно выполняться в пределах одной процедуры

while not что-то.Connected do begin
 Sleep(100);
end;


 
DeadAlice ©   (2010-11-25 12:00) [4]

а если не будет коннектед? если я добавлю в ваш вариант еще и счетчик, то sleep() будет создавать только бесполезную паузу.


 
clickmaker ©   (2010-11-25 12:05) [5]

я не понимаю: коннект - в отдельном потоке? тогда [3] может помочь
если не в отдельном, то почему [0] не работает?


 
DiamondShark ©   (2010-11-25 12:05) [6]


> компонент.

Прямо так и называется?


 
Leonid Troyanovsky ©   (2010-11-25 12:05) [7]


> clickmaker ©   (25.11.10 11:54) [3]

>  Sleep(100);

May be Application.ProcessMessages.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2010-11-25 12:13) [8]

> DeadAlice  (25.11.2010 12:00:04)  [4]

Это без sleep() будет бесполезная нагрузка.
Ну а условия выхода можешь делать как угодно, но ведь в этом случае придешь
к началу.


 
DeadAlice ©   (2010-11-25 12:23) [9]

Это библиотека, так что Application.ProcessMessages не прокатит.

В любом случае даже
компонент.Connect;
sleep(10000);
if компонент.Connected then ShowMessage("+");

не дает соединиться, а
компонент.Connect;
ShowMessage("PAUSE");
if компонент.Connected then ShowMessage("+");

показывает +


 
Anatoly Podgoretsky ©   (2010-11-25 12:30) [10]

Application.ProcessMessages делается не для библиотеки.
Ты бы все таки попробовал.


 
DeadAlice ©   (2010-11-25 12:39) [11]

Итак, получилось, нашел подсказку в DelphiWorld.

Вместо sleep() я использую следующую функцию:

procedure Delay(msecs: Longint);
var
  targettime: Longint;
  Msg: TMsg;
begin
  targettime := GetTickCount + msecs;
  while targettime > GetTickCount do
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      If Msg.message = WM_QUIT Then
      begin
        PostQuitMessage(msg.wparam);
        Break;
      end;
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;


 
Дмитрий Белькевич   (2010-11-25 12:40) [12]

Синхронизация с библиотекой в принципе не возможна? В смысле - от либы кода нет, что бы в ней как-то синхронизацию сделать?

Тогда:

1. Application.ProcessMessages.
2. Таймер - на форму (проверяющий Connected).
3. Другая библиотека.

Первые два решения - не очень. Только если иначе - никак.


 
DiamondShark ©   (2010-11-25 12:41) [13]

И всё-таки, что за загадочный компонент?


 
12 ©   (2010-11-25 12:42) [14]

ну, тоже самое

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
 Handled: Boolean;
begin
 Result := False;
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
   Result := True;
   if Msg.Message <> WM_QUIT then
   begin
     Handled := False;
     if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
     if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
       not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
     begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
   end
   else
     FTerminate := True;
 end;
end;


 
Дмитрий Белькевич   (2010-11-25 12:43) [15]


> конечно неправильно, но я не могу использовать событие OnConnected
> компонента, так как код должен линейно выполняться в пределах
> одной процедуры.


Ага, OnConnected всё таки есть. Почему "так как код должен линейно выполняться в пределах одной процедуры."? Или опять идиотская учебная задача?


 
Leonid Troyanovsky ©   (2010-11-25 12:51) [16]


> DeadAlice ©   (25.11.10 12:23) [9]

> Это библиотека, так что Application.ProcessMessages не прокатит.


var
msg: TMsg;
idtimer: UINT;
begin
 idtimer := SetTimer(0, 0, 5000, nil);
 while GetMessage(msg, 0, 0, 0) do
   begin
     TranslateMessage(msg);
     DispatchMessage(msg);
     if (msg.message = WM_TIMER) then
       Break;
   end;
 KillTimer(0, idtimer);
end;

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-11-25 13:01) [17]


> DeadAlice ©   (25.11.10 12:39) [11]

> Вместо sleep() я использую следующую функцию:

В печку ее.

--
Regards, LVT.


 
DeadAlice ©   (2010-11-25 13:15) [18]

Нда, все же не получилось.

Компонент IP*Works!

Линейное выполнение - потому что это COM-плагин для 1С, когда выполнение функции доходит до конца - выполнение прекращается.

К примеру:

имеется событие OnConnected.
в основной процедуре вызываем компонент.Connect. если после него поставить delay(1000), то событие будет вызвано, если delay(100) - то нет, не успеет.


 
sniknik ©   (2010-11-25 14:13) [19]

> в основной процедуре вызываем компонент.Connect. если после него поставить delay(1000)
почему не поставить

компонент.Connect;
while not компонент.Connected do sleep(10);

?
ну или чуть усложнить это проверкой таймаута.


 
DiamondShark ©   (2010-11-25 15:05) [20]


> sniknik ©   (25.11.10 14:13) [19]

Не, там, похоже, коипонент без выкачки сообщений Connected вообще не выставит


 
Anatoly Podgoretsky ©   (2010-11-25 15:09) [21]

Но он отказывается использовать ProcessMessages


 
KSergey ©   (2010-11-25 15:36) [22]

Т.е. фактически нужен компонент с синхронными операциями, а используется компонент, выполняющий опеерации асинхронно и весь вопрос в том, как сделать синхронное выполнение  операций, так?
Может взять другой компонент, с вкладки Indy, например?


 
Anatoly Podgoretsky ©   (2010-11-25 16:13) [23]

А что за компонент и что заставляет использовать не тот компонент?


 
KSergey ©   (2010-11-25 16:53) [24]

> Anatoly Podgoretsky ©   (25.11.10 16:13) [23]
> А что за компонент

Этот вопрос мучает многих в данной ветке, но автор унесет этот секрет ... в общем куда-нибудь.


 
DeadAlice ©   (2010-11-25 17:04) [25]

Я ж уже указал - компонент этот - IP*Works!
Сработает ли это с Indy? Могу ли я отправить строку и после этого ждать строку в этой же процедуре, а не ожидать события?


 
clickmaker ©   (2010-11-25 17:23) [26]

> Сработает ли это с Indy?

угу


 
KSergey ©   (2010-11-25 21:36) [27]

> Я ж уже указал - компонент этот - IP*Works!

Конкретная компонента не может содержать в имени звездочку. От того и непонятки.
Но вроде гугль подсказывает, что это набор компонент так зовется.
Про инди clickmaker ответил.


 
Inovet ©   (2010-11-25 22:06) [28]

> [27] KSergey ©   (25.11.10 21:36)
> Про инди clickmaker ответил.

Глубины Indy в переводе АП
http://www.podgoretsky.com/ddp/MyDDP.aspx



Страницы: 1 вся ветка

Текущий архив: 2011.02.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
15-1289343546
Gu
2010-11-10 01:59
2011.02.20
MKV


15-1283411101
George
2010-09-02 11:05
2011.02.20
Еще немного музыки


15-1288465490
Делфиец
2010-10-30 23:04
2011.02.20
Зацените прогу


15-1289237346
Алёна
2010-11-08 20:29
2011.02.20
Вопрос по Делфи


15-1289251794
Юрий
2010-11-09 00:29
2011.02.20
С днем рождения ! 9 ноября 2010 вторник