专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程
源码下载地址为:
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
#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
总结
以上是生活随笔为你收集整理的专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: android 返回销毁活动,andro
- 下一篇: 简单动态网站搭建