如何用qt编写多线程的dll?

qq_31606671 2015-10-15 01:29:26

最近我在学习socket编程,想写一个dll,调用就能完成与服务器通信,但是不知道为何,用来完成这个任务的线程在dll一运行就异常退出,下面是我的代码:
aclient.h

#ifndef ACLIENT_H
#define ACLIENT_H

#include <QObject>
#include <QHostAddress>
#include <QTcpSocket>

class AClient : public QObject
{
Q_OBJECT
public:
explicit AClient(QObject *parent = 0);
//线程启动时的初始化
bool start();
//设置服务器ip
void setIP_Address(QString ip);
//设置服务器端口
void setPort(quint16 port);
//断线重连
bool ReConnectOnLoss(QHostAddress address);
//发送string
qint64 writeString(QString str);
//发送字节流
qint64 writeByteArray(QByteArray block);
private:
//服务器ip
QString IP_ADDRESS;
//服务器端口
quint16 PORT;
//套接字
QTcpSocket *socket;

};

#endif // ACLIENT_H

athreah.h

#ifndef ATHREAD_H
#define ATHREAD_H

#include <QThread>
#include "aclient.h"

class AThread : public QThread
{
Q_OBJECT
public:
AThread(QString ip,quint16 port);
~AThread();
//发送字符串
qint64 writeStr(QString str);
//发送字节流
qint64 writeByteArray(QByteArray block);
protected:
void run();
private:
//负责通信的接受和发送

AClient *myclient;
//服务端ip
QString IP_Address;
//服务端端口
quint16 Port;

};

#endif // ATHREAD_H


dllaurorasocket.h

#ifndef DLLAURORASOCKET_H
#define DLLAURORASOCKET_H

#include "mythread.h"
extern "C"
{
Q_DECL_EXPORT IAuroraSocket * createSocketThread();
Q_DECL_EXPORT void RealeaseThread(IAuroraSocket *asocket);
}

#endif // DLLAURORASOCKET_H


接口
iaurorasocket.h

#ifndef IAURORASOCKET_H
#define IAURORASOCKET_H

#include "iaurorasocket_global.h"

class IAURORASOCKETSHARED_EXPORT IAuroraSocket
{

public:
IAuroraSocket();
virtual ~IAuroraSocket();

virtual void dosomething() = 0;
};

#endif // IAURORASOCKET_H


接口实现
mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include "iaurorasocket.h"
#include <QDebug>
#include <QObject>
#include <athread.h>
class MyThread:public IAuroraSocket,public QObject
{

public:
MyThread();
virtual ~MyThread();
virtual void dosomething();
//private:
AThread *athread;
int i;
};

#endif // MYTHREAD_H


mythread.cpp

#include "mythread.h"

MyThread::MyThread()
{
//this->athread = new AThread("192.168.1.17",2048);
//this->athread->start();
i=0;
}
MyThread::~MyThread()
{
}
void MyThread::dosomething(){
//i++;
//qDebug()<<"1234";
this->athread = new AThread("192.168.1.17",2048);
this->athread->start();
}



使用dll

QLibrary lib("D:\\Codes\\qt\\build-DllAuroraSocket-Desktop_Qt_5_3_MinGW_32bit-Debug\\debug\\DllAuroraSocket.dll");
if (lib.load())
{
qDebug()<<"加载成功";
// 定义插件中的两个导出函数的原型
typedef IAuroraSocket* (*CreateSocketFunction)();
typedef void (*ReleaseSocketFunction)(IAuroraSocket* mysocket);

// 解析导出函数
CreateSocketFunction createASocket =
(CreateSocketFunction) lib.resolve("createSocketThread");
ReleaseSocketFunction releaseASocket =
(ReleaseSocketFunction) lib.resolve("RealeaseThread");

if (createASocket && releaseASocket)
{
qDebug()<<"导出成功";
// 创建Animal对象
IAuroraSocket * ASocket = createASocket();
//IAuroraSocket * ASocket1 = createASocket();
if (ASocket)
{
// 使用插件功能
ASocket->dosomething();

// 插件使用完毕,删除对象
// releaseASocket(ASocket);
}
}
else
{
qDebug()<<"导出失败";
}
// 卸载插件
lib.unload();
}
else
{
qDebug()<<"加载失败";
}



请问我该如何修改,实现在dll内使用socket多线程编程?
...全文
1203 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧