阻塞服务器线程如何退出,并且在退出时释放资源
1.设置accept函数超时时间,设置推出标志
//设置阻塞超时时间, 用于主程序退出时控制线程退出
struct timeval timeout = {5, 0};
setsockopt(server_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));
while (server_stop == 0) {
printf("reload_server accept...\n");
client_addr_size = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_addr_size);
}
2.使用select函数超时
这个还没具体学怎么实现,后续有机会添加
lvgl多线程刷新
lvgl不是线程安全的,因此多线程需要设置,找到文档如下Operating system and interrupts。
main.c
while (!quit) {
//心跳
lv_tick_inc(LVGL_TICK);
lvgl_lock();
lv_task_handler();
lvgl_unlock();
usleep(LVGL_TICK * 1000);
}
thread.c
lvgl_lock();
reload(canvasPageMain);
lvgl_unlock();
但是如果reload阻塞太久呢,超过了lv_tick_inc设置的周期,对lvgl又有什么样影响呢?这个问题暂时还没找到答案。
服务器端代码
void *reload_server(void *arg){
printf("reload_server start!\n");
int server_sock = -1;
int client_sock = -1;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
socklen_t client_addr_size;
char message[100];
while(server_stop == 0) {
server_sock = socket(PF_INET, SOCK_STREAM, 0);
if (server_sock == -1) {
printf("socket create failed\n");
sleep(5);
continue;
}
//设置阻塞超时时间, 用于主程序退出时控制线程退出
struct timeval timeout = {5, 0};
setsockopt(server_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(reload_server_port);
int res = bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(res == -1){
printf("socket bind failed\n");
close(server_sock);
sleep(5);
continue;
}
res = listen(server_sock, SOMAXCONN);
if (res == -1) {
printf("socket listen failed\n");
close(server_sock);
sleep(5);
continue;
}
while (server_stop == 0) {
printf("reload_server accept...\n");
client_addr_size = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_addr_size);
if(client_sock == -1){
printf("socket accept failed\n");
close(client_sock);
//sleep(5);
continue;
}
recv(client_sock, message, sizeof(message), 0);
printf("server get: %s\n", message);
if(!strcmp(reload_request, message)) {
printf("reload start!!!, %ld\n", gettid());
lvgl_lock();
//int t = lv_event_send(reload_btn, LV_EVENT_CLICKED, NULL);
//sleep(30);
printf("sleep\n");
reload(canvasPageMain);
lvgl_unlock();
/*if(t != LV_RES_OK){
printf("reload send failed\n");
}*/
}
close(client_sock);
continue;
}
}
close(server_sock);
close(client_sock);
printf("reload_server exit\n");
}
void reload_server_stop(){
server_stop = 1;
}