Упоминание в заголовке У меня есть некоторые странные проблемы с потоками.
В основном я обертываю 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
}
но отладчик не запускается ...