Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Аналог функции sleep() без прерывания работы приложения [D7, WinXP]


Страницы:   1 2

DeadAlice ©   (2010-11-25 11:08:00) 

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

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

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

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


Inovet   (2010-11-25 22:06:00) [1]

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

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


KSergey   (2010-11-25 21:36:00) [2]

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

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


clickmaker   (2010-11-25 17:23:00) [3]

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

угу


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

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


KSergey   (2010-11-25 16:53:00) [5]

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

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


Anatoly Podgoretsky   (2010-11-25 16:13:00) [6]

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


KSergey   (2010-11-25 15:36:00) [7]

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


Anatoly Podgoretsky   (2010-11-25 15:09:00) [8]

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


DiamondShark   (2010-11-25 15:05:00) [9]


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

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


sniknik   (2010-11-25 14:13:00) [10]

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

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

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


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

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

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

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

К примеру:

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


Leonid Troyanovsky   (2010-11-25 13:01:00) [12]


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

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

В печку ее.

--
Regards, LVT.


Leonid Troyanovsky   (2010-11-25 12:51:00) [13]


> 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.


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


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


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


12   (2010-11-25 12:42:00) [15]

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

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;


DiamondShark   (2010-11-25 12:41:00) [16]

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


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

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

Тогда:

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

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


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

Итак, получилось, нашел подсказку в 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;


Anatoly Podgoretsky   (2010-11-25 12:30:00) [19]

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


DeadAlice   (2010-11-25 12:23:00) [20]

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

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

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

показывает +


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо