Форум: "Начинающим";
Текущий архив: 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