Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование ITask как await / 23 сообщений из 23, страница 1 из 1
12.02.2019, 14:48
    #39772867
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
Привет всем.
Я нуждаюсь помочь профессионала!

Задача:
Общаться надо с неким контролером. Вот пример:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function DeviceCallback(const AResponse: PAnsiChar): WideString; stdcall;
begin
  // обрабатывать ответа устройства 
end;

  function GetDeviceValue(const ADeviceID: string; out AResponse : string): Boolean;
var  
  lRequest: string;
  Controller : OleVariant;
begin
  Result := False; 
  lRequest := 'get.value';

  Controller := GetController(ADeviceID);

  Controller.SendRequest(ADeviceID, lRequest , LongInt(@DeviceCallback));

  // Тут надо подождать пока DeviceCallback не выполнялась.  
end;



Как дождаться пока DeviceCallback не закончилась свою выполнению? Я думаю здесь в помочь приходить ITask, но не понимаю как использовать его в моем случае! Заранее спасибо!
...
Рейтинг: 0 / 0
12.02.2019, 14:57
    #39772878
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
Alimkulov,

подозреваю, что девайскэлбэк вызывается в контексте драйвера?
Если так, то достаточно запомнить ответ и отправить себе (своему окну или потоку) сообщение с его содержимым.
...
Рейтинг: 0 / 0
12.02.2019, 15:00
    #39772881
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
wadman,
Спасибо за ответ!
Да, DeviceCallback вызывается в контексте драйвера, и вызывающий процесс в DLL. Причем вызывающий процесс многопоточный.
...
Рейтинг: 0 / 0
12.02.2019, 15:02
    #39772884
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
Все примеры по ITask только Sleep используют.
...
Рейтинг: 0 / 0
12.02.2019, 15:05
    #39772886
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
AlimkulovЯ думаю здесь в помочь приходить ITask, но не понимаю как использовать его в моем случае!Я тоже не знаю. Я бы так что-то вроде такого:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var
  DeviceResult: AnsiString;

function DeviceCallback(const AResponse: PAnsiChar): WideString; stdcall;
begin
  DeviceResult := AnsiString( AResponse );
  SetEvent;
end;

function GetDeviceValue(const ADeviceID: string; out AResponse : string): Boolean;
var  
  lRequest: string;
  Controller : OleVariant;
begin
  Result := False; 
  lRequest := 'get.value';

  Controller := GetController(ADeviceID);
  ResetEvent;
  Controller.SendRequest(ADeviceID, lRequest , LongInt(@DeviceCallback));
  Event.WaitFor;
  AResponse := DeviceResult;
end;
...
Рейтинг: 0 / 0
12.02.2019, 15:09
    #39772890
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
YuRock,
Спасибо за ответ!

Event - что за объект это?
DeviceResult - что будет если много потоков?
...
Рейтинг: 0 / 0
12.02.2019, 15:11
    #39772893
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
Я могу поместить DeviceCallback как метод некого класса?
...
Рейтинг: 0 / 0
12.02.2019, 15:12
    #39772894
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
YuRock, а если вызов функции GetDeviceValue из UI потока - то юзер будет любоваться на зависшее окно? Уж лучше как wadman советовал
...
Рейтинг: 0 / 0
12.02.2019, 15:18
    #39772896
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
white_nigger,
GetDeviceValue один из функции API в DLL. Пользователи этого API сами заботиться насчет зависание! Вот они смогут применять технику wadman'а наверное!
...
Рейтинг: 0 / 0
12.02.2019, 15:45
    #39772917
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
white_niggerYuRock, а если вызов функции GetDeviceValue из UI потока - то юзер будет любоваться на зависшее окно? Уж лучше как wadman советовалЗадача ТС была - именно дождаться ответа, а не перепостить его из коллбэка.
...
Рейтинг: 0 / 0
12.02.2019, 15:48
    #39772921
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
AlimkulovЯ могу поместить DeviceCallback как метод некого класса?Нет. Скажи спасибо разработчикам dll, которые не предусмотрели доп. параметр в SendRequest и коллбэке типа UserParam: Pointer, в который можно было бы передать указатель на объект класса.
Возможно, хватило бы и DeviceID, но в коллбэке и его нет.
...
Рейтинг: 0 / 0
12.02.2019, 15:52
    #39772923
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
AlimkulovEvent - что за объект это?Например, TSimpleEvent
AlimkulovDeviceResult - что будет если много потоков?Будет плохо. Тогда ты вообще не разберешь, откуда что пришло. Ну и, понятно, синхронизацию придется делать. В общем, лучше тогда переделать всю логику на вариант wadman'а, но тогда об ожидании и речи нет.
...
Рейтинг: 0 / 0
12.02.2019, 17:28
    #39772967
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
YuRockЗадача ТС была - именно дождаться ответа, а не перепостить его из коллбэка.Не уверен. Он спросил как смог не обладая должными знаниями. Единственное зачем может понадобиться это ожидание - это получение результата в DeviceCallback (о чем ТС и пишет). И нет никакой необходимосьти фризить при этом каллера
...
Рейтинг: 0 / 0
12.02.2019, 18:59
    #39773017
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
AlimkulovЯ могу поместить DeviceCallback как метод некого класса?
Только если классовый статический, чисто для логической организации. Никаких преимуществ от того, что метод входит в класс, не будет.
...
Рейтинг: 0 / 0
13.02.2019, 01:12
    #39773103
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
white_niggerЕдинственное зачем может понадобиться это ожидание - это получение результата в DeviceCallback (о чем ТС и пишет). И нет никакой необходимосьти фризить при этом каллераМало ли. Может, нужно синхронно, в ходе выполнения какой-то процедуры, сразу получить результат. Post куда-то в таком случае не поможет.
...
Рейтинг: 0 / 0
13.02.2019, 07:42
    #39773125
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
YuRockwhite_niggerЕдинственное зачем может понадобиться это ожидание - это получение результата в DeviceCallback (о чем ТС и пишет). И нет никакой необходимосьти фризить при этом каллераМало ли. Может, нужно синхронно, в ходе выполнения какой-то процедуры, сразу получить результат. Post куда-то в таком случае не поможет.
Морозить интерфейс это от неумения и/или кривой архитектуры.
...
Рейтинг: 0 / 0
13.02.2019, 11:15
    #39773224
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
wadmanYuRockпропущено...
Мало ли. Может, нужно синхронно, в ходе выполнения какой-то процедуры, сразу получить результат. Post куда-то в таком случае не поможет.
Морозить интерфейс это от неумения и/или кривой архитектуры.Ну да. Вот, кривая архитектура, к примеру.

А вообще... Если я вызываю функцию и хочу получить её результат. Здесь и сейчас, а не куда-то. То это не такая уж и кривая архитектура. Смотря с какой стороны посмотреть. Например, речь вообще об интерфейсе не идет.
...
Рейтинг: 0 / 0
13.02.2019, 11:20
    #39773229
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
YuRockТо это не такая уж и кривая архитектура.
Например, вынести это в поток и ждать сколько хочешь.
...
Рейтинг: 0 / 0
13.02.2019, 12:01
    #39773260
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
+1 wadman :)
...
Рейтинг: 0 / 0
13.02.2019, 13:43
    #39773329
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
wadmanYuRockТо это не такая уж и кривая архитектура.
Например, вынести это в поток и ждать сколько хочешь.Так оно ж и так в потоке, потому и ждать приходится.
...
Рейтинг: 0 / 0
13.02.2019, 14:50
    #39773411
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
YuRockТак оно ж и так в потоке
вгде? по первому топику ТС этого не скажешь. Как я понял, он хочет сделать ожидание внутри функции GetDeviceValue вместо того, чтобы вызывать ее внутри потока.
...
Рейтинг: 0 / 0
13.02.2019, 14:58
    #39773421
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
ДокYuRockТак оно ж и так в потоке
вгде? по первому топику ТС этого не скажешь. Как я понял, он хочет сделать ожидание внутри функции GetDeviceValue вместо того, чтобы вызывать ее внутри потока.
Я из этого:
AlimkulovDeviceCallback вызывается в контексте драйвера, и вызывающий процесс в DLL. Причем вызывающий процесс многопоточный .
сделал такой вывод. (хотя это и под вопросом, конечно).

Но, главное, конечно, в том, что если бы Controller.SendRequest не создавал поток внутри себя - то и ждать не надо было бы ничего. Была бы гарантия, что после выполнения SendRequest коллбэк уже либо вызвался, либо уже никогда не будет вызван.
...
Рейтинг: 0 / 0
14.02.2019, 09:29
    #39773689
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ITask как await
Спасибо всем!
Я тут обсуждал с разработчиками драйвера контролера насчет того, чтобы сделать возможность отправить и получить контекст типа UINT32. Но, к сожалению, они почему то не смогут сделать это!
Придется сделать однопоточный API.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование ITask как await / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]