Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Persian
  4. مشکل با سیگنال اسلات در کنسول کیوت
QtWS25 Last Chance

مشکل با سیگنال اسلات در کنسول کیوت

Scheduled Pinned Locked Moved Persian
6 Posts 3 Posters 3.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    mr.s.h.h
    wrote on 11 May 2012, 17:35 last edited by
    #1

    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}. بازم متشکر
    منتظر پاسخ هستم
    ممنون

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mr.s.h.h
      wrote on 12 May 2012, 06:26 last edited by
      #2

      هیچ مومنی بلد نیست اینجا یه سیگنال اسلات توی کنسول بزاره؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
      یعنی اینقد سخته؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

      1 Reply Last reply
      0
      • M Offline
        M Offline
        mohsen
        wrote on 12 May 2012, 16:16 last edited by
        #3

        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 قرار میگیره یا نه

        1 Reply Last reply
        0
        • S Offline
          S Offline
          soroush
          wrote on 23 May 2012, 18:28 last edited by
          #4

          p{direction:rtl;text-align:right}. خوب این برنامه چیزی اجرا نمی‌کنه. بلافاصله باید خارج بشه. برای این که زمان‌بندی درست در بیاد باید شانس داشته باشی
          از طرف دیگه بافر رو خالی نمی‌کنی. برای این که داده‌های جدید رو بتونی بخونی باید
          @
          QUdpSocket::readDatagram
          @
          رو فراخوانی بکنی.

          1 Reply Last reply
          0
          • M Offline
            M Offline
            mr.s.h.h
            wrote on 24 May 2012, 12:57 last edited by
            #5

            "خوب این برنامه چیزی اجرا نمی‌کنه. بلافاصله باید خارج بشه. برای این که زمان‌بندی درست در بیاد باید شانس داشته باشی"

            چرا چیزی اجرا نمی کنه ؟
            من که برنامه رو نگه داشتم. هر وقت
            readyread()
            بود
            میره توی قسمت دریافت پیام

            ولی نمی دونم چرا نمیره
            چیکار باید بکنم؟

            1 Reply Last reply
            0
            • S Offline
              S Offline
              soroush
              wrote on 24 May 2012, 13:48 last edited by
              #6

              p{direction:rtl;text-align:right}. بار اول که می‌خواد منتظر بمونه کجا منتظر می‌مونه؟
              من عین همین برنامه رو قبلا نوشتم. بار اول یکمی منتظر می‌مونه که داده بیاد. بعدش تو حلقه میفته و هر بار منتظر می‌مونه. فقط باید داده‌ها رو از بافر بخونی که پورت خالی بشه.

              p{direction:rtl;text-align:right}. برای انتظار اولیه من این رو فراخوانی می‌کنم:
              @
              QAbstractSocket::waitForReadyRead
              @

              p{direction:rtl;text-align:right}. بعدشم که مشخصه. در ضمن اون while رو هم بهتره بکنی‌ش if. چون هر بار که داده می‌رسه باید همشو پردازش کنی. برای این که کانفلیکت پیش نیاد یه سمافور بذار اول و آخر تابع پردازش.

              1 Reply Last reply
              0

              • Login

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • Users
              • Groups
              • Search
              • Get Qt Extensions
              • Unsolved