欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程

发布时间:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

源码下载地址为:

http://download.csdn.net/detail/qq78442761/9856423


---------------------------------------------------------------------------------------------------------------------------------------------------------

上一节为TCP通信,未读的博友请先阅读:

http://blog.csdn.net/qq78442761/article/details/72819306


---------------------------------------------------------------------------------------------------------------------------------------------------------


在编程中,实现数据共享一般用static静态成员,和静态函数进行操作,如下图:


resource.h

#ifndef RESOURCE_H #define RESOURCE_H#include <QMutex>class Resource { public:Resource();static int getResourceNum();static void increaseResourceNum(int);static void reduceResourceNum(int);static void changeToSomeNumber(int);static int resourceNum; };#endif // RESOURCE_H 具体实现如下:

resource.cpp

#include "resource.h" QMutex mutexResource;int Resource::resourceNum=0;Resource::Resource() {}int Resource::getResourceNum() {return resourceNum; }void Resource::increaseResourceNum(int Num) {mutexResource.lock();resourceNum+=Num;mutexResource.unlock();return; }void Resource::reduceResourceNum(int Num) {mutexResource.lock();resourceNum-=Num;mutexResource.unlock();return; }void Resource::changeToSomeNumber(int Num) {mutexResource.lock();resourceNum=Num;mutexResource.unlock();return; }
此时为了数据的稳定,不被破坏,使用了互斥锁机制,也就是对应上面的

mutexResource.lock()和mutexResource.unlock();


下面是线程的创建,在本程序中就是服务器每秒增加一个产品,这个功能,如下图所示:


这个对应的代码是

autoincrethread.h

#ifndef AUTOINCRETHREAD_H #define AUTOINCRETHREAD_H#include <QObject> #include <QThread> #include <QMutex> #include <windows.h> #include "resource.h"class AutoIncreThread : public QThread { public:AutoIncreThread(QObject *parent);// 创建与销毁线程void Create();void Destroy();void run(); //线程入口函数};#endif // AUTOINCRETHREAD_H


autoincrethread.cpp

#include "autoincrethread.h" #include <QDebug>AutoIncreThread::AutoIncreThread(QObject *parent) {}void AutoIncreThread::Create() {this->start(); //运行线程 }void AutoIncreThread::Destroy() {this->terminate();wait(); }void AutoIncreThread::run() {while(1){Resource::increaseResourceNum(1);qDebug()<<"increaseResourceNum";Sleep(1000);} }

他的调用在服务器的widget.cpp里面,如下:

void Widget::AutoIncreBtn() {if(AutoInrestatus) //自增的情况(或想让他停止自增){ui->ResourceAutoInpushButton->setText("开始自增");//销毁线程m_resourceNumAutoIncre->Destroy();delete m_resourceNumAutoIncre;killTimer(m_timerId); // 关闭定时器AutoInrestatus=false;}else //想让他自增{//用一工作线程实现m_resourceNumAutoIncre=new AutoIncreThread(NULL);m_resourceNumAutoIncre->Create();m_timerId = startTimer(500);ui->ResourceAutoInpushButton->setText("停止自增");AutoInrestatus=true;}}

源码可exe文件可以通过本文最上面的链接进行下载。

下一节是用户互斥量版本,链接如下:

http://blog.csdn.net/qq78442761/article/details/72887926

总结

以上是生活随笔为你收集整理的专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。