VB API函数sleep在睡眠时,导致窗体不能移动,该如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB API函数sleep在睡眠时,导致窗体不能移动,该如何解决?相关的知识,希望对你有一定的参考价值。

我在使用API函数sleep时,发现 当sleep在睡眠期间,导致窗体不能够移动,不知道该如何解决呢?

参考技术A sleep其实就是一个死循环,期间窗口呈假死状态.不断的循环直到时间到了.如果不做成死循环的话sleep时间就不会控制的很精确 参考技术B 不单单是sleep,所有阻塞的函数都会这样。
使用多线程技术,请查阅书籍。本回答被提问者采纳

线程中的 sleep() 也会导致 main 睡眠

【中文标题】线程中的 sleep() 也会导致 main 睡眠【英文标题】:sleep() in thread causes main to sleep too 【发布时间】:2017-05-09 10:17:49 【问题描述】:

我有一个网关服务器和 2 个客户端。(在 Oracle VM VirtualBox 中制作)。

在我的网关服务器中,我有 listener.c 监听所有数据包。(在 while(1) 循环中)。

如果客户端发送了一个有效的令牌,我必须把它放在我的授权 MAC 列表中,并且所有来自授权 MAC 的数据包都必须转发 180 秒。 (换句话说,给定 180 秒的互联网访问时间)。

在 180 秒之前,单个用户的东西正在运行。

/* authorized MACs list */
char *auth_macs[5];
int client;
pthread_mutex_t lock;

/* after 3 min remove the client from auth list */
void *timer(void *arg)
    sleep(180);
    pthread_mutex_lock(&lock);  
    auth_macs[client] = " ";
    client--;
    pthread_mutex_unlock(&lock);
    return NULL;

这就是我尝试实现计时器线程的方式。 client 是一个全局变量,在 main 函数中会发生变化。

if(has_token == 1)
    client++;
    sprintf(client_ip, "./accept.sh %s", sender);
    system(client_ip);
    auth_macs[client] = client_mac;
    /* start timer thread */
    pthread_t tid;
    pthread_create(&tid, NULL, timer,NULL);
    pthread_join(tid, NULL);

这是我开始这个线程的地方。 accept.sh 是一个允许转发的 shell 脚本。

我的问题是我认为计时器线程中的sleep(180) 只会自行停止。但相反,listener.c 停止接收数据包。

我该如何解决这个问题?我希望计时器等待 180 秒,但仍然能够在主函数中接收数据包。

【问题讨论】:

pthread_join 将等待线程终止。不管它睡多久。 【参考方案1】:

sleep() 只挂起调用线程。所以,它不会影响 main 线程。

有问题的是pthread_join() 调用:

 pthread_create(&tid, NULL, timer,NULL);
 pthread_join(tid, NULL);

这有效地使多线程变得毫无意义。因为只有主线程会一直在等待,直到创建的线程完成。

如果主线程需要加入,您需要删除pthread_join() 调用,并且可能在while(1) 循环之外。或者,您可以在线程创建循环之外调用pthread_exit(0),以便 main 在其余线程时完成执行,如果在主线程时仍然存在的话 打破它的循环,可以继续执行。

【讨论】:

或者他可以使用守护线程而不是普通线程,这样他就不需要加入它。 @JohnBollinger 该技术的问题在于,当主线程退出时,它可能会释放守护线程仍在使用的资源,从而导致守护线程中出现未定义的行为。最好有一个有序的关机顺序。

以上是关于VB API函数sleep在睡眠时,导致窗体不能移动,该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Linux下的sleep是睡眠还是忙等?占用CPU资源不?

VB怎么用API函数·详细的?

sleep() 函数完成后是不是会导致定时器中断?

Python如何修复由于睡眠功能而导致的Tkinter窗口崩溃

线程中的 sleep() 也会导致 main 睡眠

WPF中跨项目调用窗体导致资源丢失,求解决