在计时器回调完成之前,dovernctynctimer返回



我正在尝试使用异步计时器在LabWindows/CVI 2017中编写程序,但遇到了DossardAsynctimer((函数的问题。从doverardasynctimer的文档((:

呼叫创建或丢弃异步计时器的电话将无法完成 (将阻止(直到所有未偿还的异步回调返回。

但是,我遇到了一些内存问题,在调用dossardasynctimer((之后,我正在释放异步计时器线程中使用的内存。我希望记忆将不再使用,但显然不是这样吗?我在下面有一个示例程序,可以重现我的问题。运行时,由于试图访问释放内存,该程序会生成"通用保护故障"。但是,如果我对文档和文档本身的理解是正确的,那么这是不可能的,因为doverardasynctimer((应该阻止所有回调返回。

我的问题:

  1. 我是否正确理解了文档?
  2. 我在这个示例中在做愚蠢的事情吗?
  3. 我应该如何验证我的异步计时器线程在释放内存之前已完成运行?

示例程序:

#include <ansi_c.h>
#include <asynctmr.h>
#include <stdio.h>
#include <utility.h> 
#include <userint.h>

typedef struct {
    int* array;
} MyStruct;
int CVICALLBACK ShuffleValues (int reserved, int timerId, int event, void *callbackData, int eventData1, int eventData2)
{
    if (event == EVENT_TIMER_TICK) {
        printf("startn");
        MyStruct* mystruct = callbackData;
        // Shuffle values
        for(int i = 0;i < 1000;i++) {
            mystruct->array[0] = mystruct->array[1];
            mystruct->array[1] = mystruct->array[2];
            Delay(0.01);
        }
        printf("finishedn");
    }
    return 0;
}
int main ()
{
    // Allocate memory
    MyStruct* mystruct = malloc(sizeof(MyStruct));
    mystruct->array = malloc(10 * sizeof(int));
    // Start Async Timer
    int timer = NewAsyncTimer(0.01, -1, 1, ShuffleValues, mystruct);
    // Wait a while to let the timer thread run a bit
    Delay(0.5);
    // Destroy Async Timer  
    printf("start destroyingn");
    int retval = DiscardAsyncTimer(timer);
    printf("finished destroying: %dn", retval);
    // Free memory now that the timer thread is no longer running
    free(mystruct->array);
    free(mystruct);
    Delay(1);
    return 0;
}

我还在一周前在Labwindows/CVI论坛上提出了这个问题,没有任何回应:https://forums.ni.com/t5/labwindows-cvi/discardashasynctimer-return-------IS-Complete/TD-P/3943460

我在NI论坛上没有看到您的问题。快速答案是,异步计时器在单独的线程中运行,因此您需要采取通常的预防措施。发生错误时,您可以看到[Windows] [threads]并从一个线程跳到另一个线程。使用挥发性变量进行同步或更好的信号。

相关内容

  • 没有找到相关文章

最新更新