вызов Napi :: ThreadSafeFunction :: Release () приводит к ELIFECYCLE 3221225477 (STATUS_ACCESS_VIOLATION) - PullRequest
0 голосов
/ 04 февраля 2020

Упоминание в заголовке У меня есть некоторые странные проблемы с потоками.

В основном я обертываю PS2000 Api с node-addon-api , как в связанном примере .

Поскольку этим обратным вызовам API нужны функции, подобные "C", я запутал их чем-то вроде:

CLASSNAME *trampoline[N] = {}
template<int I>f(...){
  trampoline[I]->tsfn.BlockingCall(&args, [](..., *args){
     //do stuff
     if(trampoline->calledCallbacksCount >= trampoline->estimatedCallbackCount){
            trampoline->tsfn.Release();
     }
  })
}
CALLBACK *fptr[N] = {
   f<0>, ..., f<N>
}

CLASSNAME::CLASSNAME(){
   trampoline[nextEmptyIndex] = this;
   this->callback = fptr[nextEmtyIndex];
}
CLASSNAME::read(){
   this->tsfn = Napi::ThreadSafeFunction::New(...)
   //...
   nativethread = std::thread([this]{
       //... start device stream & wait some time
       if(ps2000_get_streaming_last_values(this->deviceHandle, this->callback) == 0){
          // no callback
       }
       if(this->calledCallbacksCount >= this->estimatedCallbackCount){
            this->tsfn.Release();
       }
   }
}

void my_get_overview_buffers

(
   short **overviewBuffers,
   short overflow,
   unsigned long triggeredAt,
   short triggered,
   short auto_stop,
   unsigned long nValues
)

Функция API ps2000_get_streaming_last_values может вызывать обратный вызов несколько раз, и количество обратных вызовов можно оценить по длине **overviewBuffers (nValues).

Когда я пропускаю tsfn.Release() ошибки нет.

Также при использовании возвращается 1030 *.

Такое ощущение, что есть какой-то поздний обратный вызов в пустоту - но только когда нить освобождена ...

Я в растерянности - у кого-то есть идея?


Подождите!

Что происходит с memcpied *buffers, который передается в jsCallback.Call({Napi::ArrayBuffer::New(env, *buffer, size)})

, это нарушение доступа? как вы решаете это тогда, не отпуская tsfn?


Я работаю над Windows в VSCODE,

мой запуск json содержит:

     {
        "name": "Debug",
        "type": "cppvsdbg",
        "request": "launch",
        "program": "node",
        "args": ["index.ts"],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false
    }

но отладчик не запускается ...

1 Ответ

0 голосов
/ 07 февраля 2020

Проблема не , связанная с node-addon-api.

Это было переполнение буфера, вызванное тем, что устройство пикоскопа собирало много данных из-за задержки или ультимативно что приводит к nValues > OverviewBufferSize, что приводит к тому, что при копировании этих буферов выход за пределы диапазона и, следовательно, к нарушениям доступа.

Устранение этих случаев и увеличение размера буфера решили эту проблему.

...