回调函数及线程的使用

一、在QT下使用C11的函数

复制代码
 1 #pragma once
 2 //C11的方法
 3 #include <thread>         // std::thread, std::this_thread::sleep_for
 4 #include <chrono>         // std::chrono::seconds
 5 
 6 typedef  struct _point
 7 {
 8     _point()
 9     {
10         nX = 0;
11         nY = 0;
12     }
13     int nX;
14     int nY;
15 }POIINT, *PPOIINT;
16 
17 typedef void(*UPDAPOINTCALLBACK)(POIINT* point, void* pDlg);
18 
19 class ThreadAndCall
20 {
21 public:
22     ThreadAndCall();
23     ~ThreadAndCall();
24 public:
25     void setupUpdateGUICallback(UPDAPOINTCALLBACK callback, void* pDlg);
26     void StartThread();
27 private:
28     UPDAPOINTCALLBACK     updatePointCallback;
29     void* pDlg;
30 private:
31     static void funcThread(ThreadAndCall *pThis);
32 private:
33     
34 };
ThreadAndCall.h
复制代码
复制代码
#include "ThreadAndCall.h"
#include <mutex>

using namespace std;
mutex g_lock; //全局互斥锁对象

ThreadAndCall::ThreadAndCall()
{
}


ThreadAndCall::~ThreadAndCall()
{
}

void ThreadAndCall::setupUpdateGUICallback(UPDAPOINTCALLBACK callback, void* pDlg)
{
    this->updatePointCallback = callback;
    this->pDlg = pDlg;
}

void ThreadAndCall::StartThread()
{
    thread t1(funcThread, this);
    t1.detach();
    //t1.join();
}

void ThreadAndCall::funcThread(ThreadAndCall *pThis)
{
    POIINT point;
    for (int i = 0; i < 10000; i++)
    {
        //g_lock.lock(); //上锁 这个程序加不加都可以
        point.nX = i;
        point.nY = i;
        pThis->updatePointCallback(&point, pThis->pDlg);
        printf("%d--%d\n",i,i);
        this_thread::sleep_for(chrono::seconds(2));
        //g_lock.unlock(); //解锁
    }
}
ThreadAndCall.cpp
复制代码
复制代码
1.=======================
private slots:
    void on_threadcallBtn_clicked();
private:
    void static updatePoitGUI(POIINT* point, void* pDlg);
2.=======================
void BaseDemo::on_threadcallBtn_clicked()
{
    printf("=================================ThreadAndCall===============================\n");
    pTestThreadAndCall = new ThreadAndCall();
    pTestThreadAndCall->setupUpdateGUICallback(updatePoitGUI, this);
    pTestThreadAndCall->StartThread();
}

void BaseDemo::updatePoitGUI(POIINT* point, void* pDlg)
{
    BaseDemo *pWindow = (BaseDemo *)pDlg;
    QString str;
    str = QString("X:%1,Y:%2").arg(point->nX).arg(point->nY);
    pWindow->ui.showLable->setText(str);
    //this_thread::sleep_for(chrono::seconds(10));
}
调用
复制代码

 

posted @   泽良_小涛  阅读(248)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示