专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程
源碼下載地址為:
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
- 下一篇: 简单动态网站搭建