Информация об изменениях

Сообщение Re[5]: использования CEF в Visual Studio от 27.01.2017 13:54

Изменено 27.01.2017 14:12 Serginio1

Re[5]: использования CEF в Visual Studio
Здравствуйте, fddima, Вы писали:

Прошу прощения. Зарегистрировался на форуме. Но что то не могу отправить сообщение.

Задам и здесь. Суть такая

Я вызываю асинхронный метод

var GetStringAsync = CC.GetPromise(TO.Id,"GetStringAsync", []);

GetStringAsync.then(result => alert("Fulfilled: " + result),
    error => alert("Rejected: " + error.message) // Rejected: время вышло!
  );


Который по окончании, вызывает метод С++


void ContextForNetHandlers::AsyncCalBack(const wchar_t* TaskID, bool Successfully, tVariant* ReturnValue)
     {
        

         if (!CefCurrentlyOn(TID_UI)) {
             // Execute on the UI thread.
            // CefPostTask(TID_UI, base::Bind(&AsyncCalBack2, TaskID, Successfully,ReturnValue, CallbackContext));
             CefPostTask(TID_UI, base::Bind(&SetCallBacks::AsyncCalBack, this->scb, TaskID, Successfully, ReturnValue));
             return;
         }

         scb->AsyncCalBack(TaskID, Successfully, ReturnValue);
     }


Вот код SetCallBacks

     //==================== Set CallBacs
     bool SetCallBacks::Execute(const CefString& name,
         CefRefPtr<CefV8Value> object,
         const CefV8ValueList& arguments,
         CefRefPtr<CefV8Value>& retval,
         CefString& exception) {

        
             if (arguments.size() == 1 && arguments[0]->IsFunction()) {
                 AsyncMetodCall = arguments[0];
                 CallbackContext = CefV8Context::GetCurrentContext();
                 cfn->scb = this;
                 return true;
             }
        

         return true;

     }

     void SetCallBacks::AsyncCalBack(const wchar_t* TaskID, bool Successfully, tVariant* ReturnValue)
     {
         CefV8ValueList args;
         CefRefPtr<CefV8Value> retval;
         CefRefPtr<CefV8Exception> exception;


         if (CallbackContext.get() && CallbackContext->Enter()) {

             args.push_back(CefV8Value::CreateBool(true));
             args.push_back(NetObjectToNative::ConvertNetToCef(ReturnValue, true));
             args.push_back(CefV8Value::CreateString(TaskID));

             delete[] TaskID;
             if (AsyncMetodCall->ExecuteFunctionWithContext(CallbackContext, NULL, args)) {
                 if (exception.get()) {
                     // Execution threw an exception.
                 }
                 else {
                     // Execution succeeded.
                 }
             }
             CallbackContext->Exit();
         }
     }


В вики вроде написано, что CefPostTask рабочий. Сейчас посмотри Id потоков
Re[5]: использования CEF в Visual Studio
Здравствуйте, fddima, Вы писали:

Прошу прощения. Зарегистрировался на форуме. Но что то не могу отправить сообщение.

Задам и здесь. Суть такая

Я вызываю асинхронный метод

var GetStringAsync = CC.GetPromise(TO.Id,"GetStringAsync", []);

GetStringAsync.then(result => alert("Fulfilled: " + result),
    error => alert("Rejected: " + error.message) // Rejected: время вышло!
  );


Который по окончании, вызывает метод С++


void ContextForNetHandlers::AsyncCalBack(const wchar_t* TaskID, bool Successfully, tVariant* ReturnValue)
     {
        

         if (!CefCurrentlyOn(TID_UI)) {
             // Execute on the UI thread.
            // CefPostTask(TID_UI, base::Bind(&AsyncCalBack2, TaskID, Successfully,ReturnValue, CallbackContext));
             CefPostTask(TID_UI, base::Bind(&SetCallBacks::AsyncCalBack, this->scb, TaskID, Successfully, ReturnValue));
             return;
         }

         scb->AsyncCalBack(TaskID, Successfully, ReturnValue);
     }


Вот код SetCallBacks

     //==================== Set CallBacs
     bool SetCallBacks::Execute(const CefString& name,
         CefRefPtr<CefV8Value> object,
         const CefV8ValueList& arguments,
         CefRefPtr<CefV8Value>& retval,
         CefString& exception) {

        
             if (arguments.size() == 1 && arguments[0]->IsFunction()) {
                 AsyncMetodCall = arguments[0];
                 CallbackContext = CefV8Context::GetCurrentContext();
                 cfn->scb = this;
                 return true;
             }
        

         return true;

     }

     void SetCallBacks::AsyncCalBack(const wchar_t* TaskID, bool Successfully, tVariant* ReturnValue)
     {
         CefV8ValueList args;
         CefRefPtr<CefV8Value> retval;
         CefRefPtr<CefV8Exception> exception;


         if (CallbackContext.get() && CallbackContext->Enter()) {

             args.push_back(CefV8Value::CreateBool(true));
             args.push_back(NetObjectToNative::ConvertNetToCef(ReturnValue, true));
             args.push_back(CefV8Value::CreateString(TaskID));

             delete[] TaskID;
             if (AsyncMetodCall->ExecuteFunctionWithContext(CallbackContext, NULL, args)) {
                 if (exception.get()) {
                     // Execution threw an exception.
                 }
                 else {
                     // Execution succeeded.
                 }
             }
             CallbackContext->Exit();
         }
     }


В вики вроде написано, что CefPostTask рабочий. Сейчас посмотри Id потоков
Да потоки разные. Сейчас буду рыть с очередью сообщений