
最近我在學習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多執行緒編程?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/91576.html
下一篇:C++
