Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];

Вниз

Аналог функции 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.004 c
2-1290694178
ghostdelvonte@mail.ru
2010-11-25 17:09
2011.02.20
Принудительная раскладка языка


9-1188473601
@!!ex
2007-08-30 15:33
2011.02.20
Загрузочный экран.


2-1290700141
Анонимус
2010-11-25 18:49
2011.02.20
Как обрезать Image в Delphi 7?


15-1289597392
Юрий
2010-11-13 00:29
2011.02.20
С днем рождения ! 13 ноября 2010 суббота


2-1290758680
Jacksotnik
2010-11-26 11:04
2011.02.20
Edit и кнопка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский