C++ Windows Mobile/C:等待变量更改

C++ Windows Mobile/C:等待变量更改,c++,c,windows-mobile,wait,C++,C,Windows Mobile,Wait,我目前正在用C/C++为windows mobile编写一个包装器库。我必须实现并导出以下功能: void start_scanning(); int wait_for_scanning_result(); void stop_scanning(); 调用start\u scanning()以启动扫描过程wait_for_scanning_result()将等待结果可用并返回结果,stop_scanning将中止该过程 我使用的库有一个回调函数,当结果可用时执行该函数 void on_scan

我目前正在用C/C++为windows mobile编写一个包装器库。我必须实现并导出以下功能:

void start_scanning();
int wait_for_scanning_result();
void stop_scanning();
调用
start\u scanning()
以启动扫描过程
wait_for_scanning_result()
将等待结果可用并返回结果,
stop_scanning
将中止该过程

我使用的库有一个回调函数,当结果可用时执行该函数

void on_scanning_result(int result)
{
   /* My code goes here */
}
不幸的是,我必须实现上述功能,因此我的计划是这样解决:

void on_scanning_result(int result)
{
   scan_result_available = 1;
   scan_result = result;
}

int wait_for_scanning_result()
{
   /* ... wait until scan_result_available == 1 */
   return scan_result;
}

我不知道如何在windows/C中实现这一点,如果有人能帮助我或告诉我必须使用哪些函数来实现这一点,我将非常高兴

我想是这样的:

//declare as volatile to inform C that another thread
//may change the value
volatile int scan_result_available;

int wait_for_scanning_result()
{
    while(scan_result_available == 0) {
        //do nothing
    }
    return scan_result;
}

您应该了解回调是在另一个线程中运行,还是在同一个线程中异步运行,或者库是否需要其他方法来允许回调运行。

我希望是这样的:

//declare as volatile to inform C that another thread
//may change the value
volatile int scan_result_available;

int wait_for_scanning_result()
{
    while(scan_result_available == 0) {
        //do nothing
    }
    return scan_result;
}
您应该了解回调是在另一个线程中运行,还是在同一个线程中异步运行,或者库是否需要其他方法来允许回调运行。

您可以使用windows

基本上你所要做的就是:
*-创建一个事件
*-等待此事件发出信号
*-向事件发送信号

您可以使用windows

基本上你所要做的就是:
*-创建一个事件
*-等待此事件发出信号


*-向事件发出信号

这是否应该运行多线程?如果是这样,您可以使用条件变量或事件同步器。@Dirk:它运行单线程还是多线程都无关紧要。这应该运行多线程吗?如果是这样,您可以使用条件变量或事件同步器。@Dirk:不管它是运行单线程还是多线程。除了在循环中等待之外,还有什么我可以做的吗?我希望有信号灯之类的东西。是的,有,但我恐怕不熟悉Windows Mobile。实际上,这是一个相当愚蠢的想法。我不知道WM平台有任何多核CPU,所以当这个循环运行时,它会阻止其他代码运行,因此可用的扫描结果不会改变(!)呃,什么?您可以在单核处理器上运行多个线程。我发布的代码显然是一个糟糕的解决方案,但我非常肯定它会起作用。循环中必须有一条sleep()指令,强制当前线程睡眠,并且不要浪费处理器时间。这将使其他线程有时间更改scan\u result\u变量。否则,当前线程将浪费处理器时间,什么也不做。这就是MSalters要说的,我想…除了在循环中等待之外,还有什么我可以做的吗?我希望有信号灯之类的东西。是的,有,但我恐怕不熟悉Windows Mobile。实际上,这是一个相当愚蠢的想法。我不知道WM平台有任何多核CPU,所以当这个循环运行时,它会阻止其他代码运行,因此可用的扫描结果不会改变(!)呃,什么?您可以在单核处理器上运行多个线程。我发布的代码显然是一个糟糕的解决方案,但我非常肯定它会起作用。循环中必须有一条sleep()指令,强制当前线程睡眠,并且不要浪费处理器时间。这将使其他线程有时间更改scan\u result\u变量。否则,当前线程将浪费处理器时间,什么也不做。我想这就是MSalters要说的…+1。这些功能的存在正是为了这些目的。不幸的是,事件对象可能是重量级的。对于这个问题,互锁的增量和减量(以及wait())可以完成这项工作……正如SadSido所说,这是一种正确的方法,但可能有点繁重——这里也可以使用windows的关键部分功能。事件是非常基本的同步对象,受windows CE 1.0支持,它们应该非常快。有什么标准可以证明吗?@Christian Adam:谢谢。在你的帮助下,我完成了包装器库。我没有注意到任何性能问题,createevent/setevent/waitforsingleobject非常容易使用。+1。这些功能的存在正是为了这些目的。不幸的是,事件对象可能是重量级的。对于这个问题,互锁的增量和减量(以及wait())可以完成这项工作……正如SadSido所说,这是一种正确的方法,但可能有点繁重——这里也可以使用windows的关键部分功能。事件是非常基本的同步对象,受windows CE 1.0支持,它们应该非常快。有什么标准可以证明吗?@Christian Adam:谢谢。在你的帮助下,我完成了包装器库。我没有注意到任何性能问题,createevent/setevent/waitforsingleobject非常容易使用。