当前位置: 代码迷 >> QT开发 >> qt多线程间的通信有关问题?跪求各位大侠!灰常感谢啦
  详细解决方案

qt多线程间的通信有关问题?跪求各位大侠!灰常感谢啦

热度:56   发布时间:2016-04-25 04:48:59.0
qt多线程间的通信问题???????跪求各位大侠!!!灰常感谢啦!
各位大侠,我用QT多线程写了个程序,大致概括如下:

在线程B中创建了一个线程A,线程A用来读取一个文件,并将信息写入到一个全局的buffer中,每写完一次,就发送个信号给线程B,线程B收到信号后,就从buffer中将信息读出来,并且也发送一个信号给线程A,线程A收到信号就开始读取文件的下一部分内容,然后再写入到buffer中,就这样一直将文件读完!

现在问题是:线程B发送完信号后,有时候线程A好像接收不到... 有时候线程A能接收线程B发送的前两三个信号,后面的就接收不到了,有时候能接收4、5个,后面的也就接收不到了...



我刚刚学Qt的多线程,想请教一下各位大侠,是我这个程序逻辑的错误还是其它的什么错误呀.......


谢谢各位啦!

------解决方案--------------------
能不能贴点关键代码看看,单纯的看逻辑貌似没问题
------解决方案--------------------
1. 不同线程间的信号槽连接是以queue的方式连接的,也就是说发送信号后,槽函数可能不是马上运行;
2. 可以不是信号槽机制,而是在两个线程间使用互斥对象或其他同步对象 对buffer进行保护,即可
------解决方案--------------------
探讨
1. 不同线程间的信号槽连接是以queue的方式连接的,也就是说发送信号后,槽函数可能不是马上运行;
2. 可以不是信号槽机制,而是在两个线程间使用互斥对象或其他同步对象 对buffer进行保护,即可

------解决方案--------------------
这个问题可以使用条件变量解决
建议楼主重温多线程线程中->线程同步->条件变量

------解决方案--------------------
lz可以翻阅下操作系统的mutex机制。
------解决方案--------------------
你用两个QMUTEX嘛.....书上不是有个例子的吗.A写好了就LOCK上解开B纯种上的UNLOCK,然后B线程就可以读了,
读完了就LOCK上然后就UNLOCK上A的.A又可以写了.......

------解决方案--------------------
条件变量的工作原理:
假设线程A基于条件X阻塞,线程B占用CPU进行工作,并且在一定的时候修改条件X,此时线程A得到条件X变化的消息,重新检测条件X并在条件满足时占用CPU开始工作。线程A在等待的过程中不占用CPU时间。所以在cpu占用率方面不需要当心
------解决方案--------------------
可不可以用信号量啊。。能用PV操作么
------解决方案--------------------
5楼正解
------解决方案--------------------
下面的用代码来说明QMutex, QWaitCondition, QThread 的使用。
下面程序里有二个线程,一个是写入全局缓冲区的数据,一个是从全局缓冲区读取数据并打印到屏幕,有二个要注意的问题就是,当写入的字节 – 读取的字节 == 缓冲区大小时,就要等侍读取的线程读取出,再进行写,当读线程读取速度过快时,此时缓冲区为空,则要等写入字节后再读。
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>

const int DataSize = 3600; //总共显示在屏幕上的字节
const int BufferSize = 10; //缓冲区的大小
char buffer[BufferSize];

QWaitCondition bufferNotEmpty; //当缓冲区为空时,读取线程会等侍有数据后再执行读操作
QWaitCondition bufferNotFull; //当缓冲区写满时,写入线程会等侍有东西被读走以后再写入
QMutex mutex; //线程间数据的操作
int numUsedBytes = 0; //当前缓冲区的写入字节

//写入线程
class WriteBufferThread : public QThread
{
public:
void run();
};

void WriteBufferThread::run()
{
for (int i = 0; i < DataSize; ++i) {
//在对 numUsedBytes 时执行比较,增加,减少操作时都要进行加锁
mutex.lock();
if (numUsedBytes == BufferSize)
bufferNotFull.wait(&mutex); //缓冲区已满,等侍有数据被读走
mutex.unlock();
//对缓冲区的数据进行写入
buffer[i % BufferSize] = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"[i % 36];

mutex.lock();
++ numUsedBytes; //每写入一个字节缓冲区使用数加 1
bufferNotEmpty.wakeAll(); //并且告之此时缓冲区肯定不为空
mutex.unlock();
}
}
//读取和打印缓冲区内容线程
class ReadBufferThread: public QThread
{
public:
void run();
};

void ReadBufferThread::run()
{
for (int i = 0; i < DataSize; ++i) {
mutex.lock();
if (numUsedBytes == 0)
bufferNotEmpty.wait(&mutex); //缓冲区已空,等侍有数据写入
mutex.unlock();

fprintf(stderr, "%c", buffer[i % BufferSize]); //打印当前内容到屏幕

mutex.lock();
--numUsedBytes; //每读取一个字节缓冲区使用数减 1
bufferNotFull.wakeAll(); //并且告之此时缓冲区肯定不满
mutex.unlock();
}
fprintf(stderr, "\n");
}

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
  相关解决方案