![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Аналог функции sleep() без прерывания работы приложения [D7, WinXP]
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('+');
показывает +