مشکل با سیگنال اسلات در کنسول کیوت
-
p{direction:rtl; text-align:right}. سلام
راستش من چند روزه درگیره این کنسول کیوت شدم
اعصابمو خورد کرده
با gui مشکلی ندارم
ولی با کنسول به شدت مشکل دارم
مشکلم اینه که یه کلاس دارم که قراره هر وقت مثلا روی پورت 1212 چیزی اومد یه سیگنالی دریافت کنه و به طبع اون یه اسلاتی رو اجرا کنه
اما طبق این کدی که نوشتم
اصلا سیگنال رو دریافت نمی کنه
همین برنامه رو گرافیکیشو نوشتم مشکلی ندارم
اما توی کنسول نمیدونم باید چیکار کنم
در اصل من با یه برنامه دیگه یه چیزی به پورت 1212 میفرستم
و از اون طرف توی همون برنامه آماده دریافت از پورت 1818 هستم
اگه این برنامه پایینی درست عمل کنه باید
its OK
رو من توی همون برنامه قبلی(همونی که منتظر دریافت از پورت 1818 هست) ببنیم
اما چیزی نمیاد
از این بابت هم مطمئن باشید که اون برنامه درست کار می کنه
تست کردمp{direction:rtl; text-align:right}. خواهش می کنم راهنماییم کنید
این کده رو باید چه تغییری توش بدم.
مرسی ممنون
این هم کد من
main.cpp
@#include "server.h"
#include <QtCore/QCoreApplication>int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
server *t = new server();
return a.exec();
}
@server.h
@#ifndef SERVER_H
#define SERVER_H#include <QObject>
#include <QUdpSocket>class server : public QObject
{
Q_OBJECT
public:
explicit server(QObject *parent = 0);private: QUdpSocket *udpSocket; public slots: void processPendingDatagrams();
};
#endif // SERVER_H
@server.cpp
@#include "server.h"server::server(QObject *parent) :
QObject(parent)
{
udpSocket = new QUdpSocket();
udpSocket->bind(1212);
connect(udpSocket, SIGNAL(readyRead()) , this ,SLOT(processPendingDatagrams()));}
void server::processPendingDatagrams()
{
while(udpSocket->hasPendingDatagrams())
{
//QByteArray temp;
//temp.resize(udpSocket->pendingDatagramSize());
//udpSocket->readDatagram(temp.data(),temp.size());
//QString text = QString::fromUtf8(temp);
udpSocket->writeDatagram("its OK",QHostAddress("127.0.0.1"),1818);
}}
@p{direction:rtl; text-align:right}. بازم متشکر
منتظر پاسخ هستم
ممنون -
p{direction:rtl; text-align:right}. داخل کانستراکتور جای bind با connect رو عوض کن
@server::server(QObject *parent) :
QObject(parent)
{
udpSocket = new QUdpSocket();
connect(udpSocket, SIGNAL(readyRead()) , this ,SLOT(processPendingDatagrams()));
udpSocket->bind(1212);
}
@p{direction:rtl; text-align:right}. فکر کنم سیگنال زودتر از اینکه فرمان connect اجرا بشه emit شده.
یک slot هم به سیگنال stateChanged وصل کن تا بدونی که اصلا وضعیت روی BoundState قرار میگیره یا نه -
p{direction:rtl;text-align:right}. خوب این برنامه چیزی اجرا نمیکنه. بلافاصله باید خارج بشه. برای این که زمانبندی درست در بیاد باید شانس داشته باشی
از طرف دیگه بافر رو خالی نمیکنی. برای این که دادههای جدید رو بتونی بخونی باید
@
QUdpSocket::readDatagram
@
رو فراخوانی بکنی. -
"خوب این برنامه چیزی اجرا نمیکنه. بلافاصله باید خارج بشه. برای این که زمانبندی درست در بیاد باید شانس داشته باشی"
چرا چیزی اجرا نمی کنه ؟
من که برنامه رو نگه داشتم. هر وقت
readyread()
بود
میره توی قسمت دریافت پیامولی نمی دونم چرا نمیره
چیکار باید بکنم؟ -
p{direction:rtl;text-align:right}. بار اول که میخواد منتظر بمونه کجا منتظر میمونه؟
من عین همین برنامه رو قبلا نوشتم. بار اول یکمی منتظر میمونه که داده بیاد. بعدش تو حلقه میفته و هر بار منتظر میمونه. فقط باید دادهها رو از بافر بخونی که پورت خالی بشه.p{direction:rtl;text-align:right}. برای انتظار اولیه من این رو فراخوانی میکنم:
@
QAbstractSocket::waitForReadyRead
@p{direction:rtl;text-align:right}. بعدشم که مشخصه. در ضمن اون while رو هم بهتره بکنیش if. چون هر بار که داده میرسه باید همشو پردازش کنی. برای این که کانفلیکت پیش نیاد یه سمافور بذار اول و آخر تابع پردازش.