如何用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多线程编程?
...全文
1151 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
x64_dbg 中文版功能 开源 直观和熟悉的新用户界面 类似C的表达式解析器 DLL和EXE文件的全功能调试(TitanEngine) IDA般的侧边栏与跳跃箭头 IDA样的指令令牌高亮(高亮寄存器等) 存储器映射 符号观 线程视图 内容敏感的注册查看 完全可定制的配色方案 动态识别模块和串 进口重构集成(青蟹) 快反汇编(BeaEngine) 用户数据库(JSON)征求意见,标签,书签等。 不断增长的API插件的支持 可扩展的,可调试的脚本语言自动化 多数据类型的内存转储 基本调试符号(PDB)的支持 动态堆栈视图 内置汇编(XEDParse) 查看你的补丁,并将它们保存到磁盘 内置的十六进制编辑器 查找内存模式 x64_dbg 概述 积极发展 x64_dbg正在不断的积极发展。 GPLv3 我们同时提供了可执行文件和源代码。随意作出贡献。 自定义 C ++编写的插件,改变颜色和调整你的喜好。 X64/X32支持 x64_dbg可以调试x64和X32的应用程序。只有一个接口。 建立在开源库 x64_dbg使用的Qt,TitanEngine,BeaEngine,青蟹,杨松,LZ4和XEDParse。 操作简单,功能强大的开发 x64_dbg使用C ++和Qt4的快速添加新的功能。 脚本化 x64_dbg有一个集成的,可调试,ASM-like脚本语言。 社区意识 x64_dbg有许多功能的倒车社会思想或创建的。 伸缩 编写插件来添加脚本命令或集成的工具。

703

社区成员

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

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