查看完整版本: [-- QT子线程引起主界面卡顿 --]

QTCN开发网 -> Qt基础编程 -> QT子线程引起主界面卡顿 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

xu735456 2016-12-27 15:25

QT子线程引起主界面卡顿

请教大家一个问题:
我 现在做了个TCP发送文件的软件,在子线程进行读取和发送文件,但是发送较大文件时,主界面会出现卡顿的现象,不知道是什么原因引起的,请教大家一下,这是什么原因引起的,我应该怎么解决这个问题?

谢谢大家了

realfan 2016-12-27 15:43
在传送时,主线程有没有等待之类的行为?另外,你确定传送文件是在子线程中吗?

uidab 2016-12-27 17:32
会不会是只继承了QTcpSocket。建议继承QThread 或者moveToThread,确保是在线程里面执行的。

具体还是要看你的代码。

xu735456 2016-12-28 16:43
realfan:在传送时,主线程有没有等待之类的行为?另外,你确定传送文件是在子线程中吗? (2016-12-27 15:43) 

确定进入到进程了

xu735456 2016-12-28 16:45
uidab:会不会是只继承了QTcpSocket。建议继承QThread 或者moveToThread,确保是在线程里面执行的。
具体还是要看你的代码。 (2016-12-27 17:32) 

继承了线程类,主界面会卡顿,不会崩溃

dbzhang800 2016-12-28 21:05
xu735456:确定进入到进程了 (2016-12-28 16:43) 

不妨简单描述一下你的线程是如何用的吧。十之八九是用错了

uidab 2016-12-29 08:14
xu735456:继承了线程类,主界面会卡顿,不会崩溃 (2016-12-28 16:45) 

不应该啊,估计你还是用的有问题。贴代码吧

xu735456 2016-12-29 11:41
uidab:不应该啊,估计你还是用的有问题。贴代码吧 (2016-12-29 08:14) 

    mythread = new FileTransmit_Thread();
    mythread->for_threaduse_IP = m_strIP;
    mythread->for_threaduse_cmd = FILE_PACKAGE;
    mythread->for_threaduse_dic = m_strFileName;
    mythread->start();
这里开启进程,下面是run里的代码
FILE * fd;
    int length;
    unsigned int crc32 = 0;
    int finish[2];
    int i = 0;
    char * f_char;
    char * filename;

    file_tcpSocket  = new QTcpSocket();
    file_tcpSocket->connectToHost(for_threaduse_IP, SERVPORT_FILE);
    QByteArray ba = for_threaduse_dic.toLatin1();
    filename = ba.data();
    qDebug()<<filename;
    QFile Qfile(for_threaduse_dic);
    if (!Qfile.open(QIODevice::ReadOnly))
    {
      return;
    }

    fd = fopen(filename,"rb");
    if(fd == NULL)
    {
        printf("open the file %s failed\n",filename);
    }


    while((length = fread(file_command.buf,1,MAXDATASIZE, fd))>0)
    {
        file_command.cmd = for_threaduse_cmd;
        file_command.buf_len = length;
        cmd_send_2(&file_command);

        status_recv_2(&file_fback);
        if(file_fback.status == WORK_NORMAL)
        {
            qDebug()<<QString("%1 send %2 bytes\n").arg(i++).arg(length);

        }

        crc32 = ssh_crc32_s(file_command.buf,length,crc32);
    }


    finish[0] = FINISH_MARK;
    finish[1] = crc32;
    qDebug()<<QString("crc32 = %1\n").arg(crc32);

    f_char = (char * ) finish;
    for(i=0;i<sizeof(int)*2;i++)
        file_command.buf = f_char;
    file_command.buf_len = sizeof(int)*2;
    cmd_send_2(&file_command);
    fclose(fd);

    status_recv_2(&file_fback);
    if(file_fback.status)
    {
        qDebug()<<"the file is sending success\n";
    }
    file_tcpSocket->disconnectFromHost();
    delete(file_tcpSocket);

xu735456 2016-12-29 11:42
dbzhang800:不妨简单描述一下你的线程是如何用的吧。十之八九是用错了 (2016-12-28 21:05) 

下面发了代码,麻烦看一下是不是有问题,谢谢


查看完整版本: [-- QT子线程引起主界面卡顿 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled