Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 20:33   #1
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию DCEF3(Delphi Chromium Embedded Framework 3). GetSourceProc

Доброго времени суток.
Я использую в своем проекте Delphi Chromium Embedded Framework.
Есть следующий код:
Код:
procedure CallbackGetSource(const src: ustring);
begin
   Showmessage('Get source');
end;


procedure TMainForm.ch1LoadEnd(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  httpStatusCode: Integer);
begin
 if (browser <> nil) and (browser.Identifier = ch1.BrowserId) and ((frame = nil) or (frame.IsMain)) then
   begin
          ch1.Browser.MainFrame.GetSourceProc(CallbackGetSource);
          Showmessage('Done.');
   end;
end;
Проблема в том, что сообщение "Done." появляеться раньше, чем "Get source".
Можно как то "подождать" на получение кода страницы?
Код:
 
ch1.Browser.MainFrame.GetSourceProc(CallbackGetSource); // пока этот метод не выполниться,
Showmessage('Done.'); // то эта строка не выполняеться

Последний раз редактировалось Delphi_ProGer; 21.01.2013 в 01:29. Причина: Изменил название темы, чтобы было понятнее.
Delphi_ProGer вне форума Ответить с цитированием
Старый 21.01.2013, 01:18   #2
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Есть у кого-нибудь какие-то идеи? Может как-то использовать WaitForSingleObject?
Delphi_ProGer вне форума Ответить с цитированием
Старый 21.01.2013, 01:32   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кто мешает завести любой обьект синхронизации(кроме мютекса), вам подойдет Event или критическая секция.

создать, занять, в колбэке освободить(а основной поток этого ждет) и все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.01.2013, 01:47   #4
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Цитата:
кто мешает завести любой обьект синхронизации
Нехватка опыта Поэтому и спрашиваю Вас.
Спасибо за совет. Буду пробовать.
Delphi_ProGer вне форума Ответить с цитированием
Старый 30.01.2013, 06:52   #5
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Здраствуйте снова)
Проблема у меня все же осталась...
Код:
procedure CallbackGetSource(const src: ustring);
begin
  SimpleEvent.SetEvent; // SimpleEvent: TSimpleEvent;
  SourceText:=src; // SourceText - глобальная переменная
end;

//==============================================================================
function GetSource(const frame: ICefFrame): string;
begin
  SimpleEvent:=TSimpleEvent.Create();
  Result := '';
  frame.GetSourceProc(CallbackGetSource);
  //на следующей строке просто виснет, код в колбэке не выполняеться! 
  //в этом и моя проблема...
  if WaitForSingleObject(SimpleEvent.Handle, INFINITE)=WAIT_OBJECT_0 then
  begin
    //ShowMessage('good');
    Result := SourceText;
  end;
  SimpleEvent.Free;
end;
Какие предположения, указания?
^ В коде закоментировал нужные внимания строки
Delphi_ProGer вне форума Ответить с цитированием
Старый 30.01.2013, 08:27   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

1. поместать менями. у тебя стулья раньше денег
Код:
procedure CallbackGetSource(const src: ustring);
begin
  SourceText:=src; // SourceText - глобальная переменная
  SimpleEvent.SetEvent; // SimpleEvent: TSimpleEvent;
end;
2. контрацепция в виде try/fin приветствуется
3. дедлок -ожидание самого себя. Wait усыпляет поток в котором должно произойти SetEvent

в однопоточке WaitForSingleObject с эвентом не канает
канает спин

Код:
function GetSource(const frame: ICefFrame): string;
var
  Time:DWord;
  SourceText:string;

  procedure CallbackGetSource(const src: ustring);
  begin
    SourceText:=src;
  end;
begin
  SourceText:='';
  frame.GetSourceProc(CallbackGetSource);
  Time:=GetTickCount;
  while (length(SourceText)=0) and ((GetTickCount-Time)<10000) do
    Application.ProcessMessages;
  result:=SourceText;
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 30.01.2013 в 08:53.
Slym вне форума Ответить с цитированием
Старый 30.01.2013, 19:39   #7
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Скопировал этот код
Код:
function GetSource(const frame: ICefFrame): string;
var
  Time:DWord;
  SourceText:string;

  procedure CallbackGetSource(const src: ustring);
  begin
    SourceText:=src;
  end;
begin
  SourceText:='';
  frame.GetSourceProc(CallbackGetSource);
  Time:=GetTickCount;
  while (length(SourceText)=0) and ((GetTickCount-Time)<10000) do
    Application.ProcessMessages;
  result:=SourceText;
end;
Ошибка:
Цитата:
[dcc32 Error] dpVKCore.pas(140): E2555 Cannot capture symbol 'CallbackGetSource'
Решил проблему вынесением процедуры CallbackGetSource за пределы GetSource. Но в таком случае SourceText='', а в CallbackGetSource не заходит.
Delphi_ProGer вне форума Ответить с цитированием
Старый 30.01.2013, 19:58   #8
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

а раньше как в калбек заходил? в 1 посте?
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 30.01.2013, 20:55   #9
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
а раньше как в калбек заходил? в 1 посте?
Сначала выполнялся до конца код:
Код:
   ch1.Browser.MainFrame.GetSourceProc(CallbackGetSource);
          Showmessage('Done.');
а потом через 2-3 сек(в зависимости от сложности html кода сайта) выполнялся
Код:
procedure CallbackGetSource(const src: ustring);
begin
   Showmessage('Get source');
end;
(после выхода из процедуры, в которой описан вышеуказаный код)

Последний раз редактировалось Delphi_ProGer; 30.01.2013 в 20:57.
Delphi_ProGer вне форума Ответить с цитированием
Старый 31.01.2013, 14:02   #10
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

в процедуре CallbackGetSource обрамите код в критическую секцию trtlcriticalsection.А вызов Showmessage('Get source'); так же заключите в эту же секцию.это даст нужный эффект.коллбэк-функции имеют асинхронную природу,поэтому управление возвращается сразу после вызова,подобно postmessage.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц