|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Ok, ora mi è chiaro dovrei aver fatto correttamente, debuggando mi sono assicurato che le classi accedono agli stessi dati, quel che non mi torna è cha la mia amica gui non si accorge che il thread termina, io ho usato connent in questo modo:
Codice:
connect(MyPortScanner,SIGNAL(terminated()),this,SLOT(UpdateResult())); |
|
|
|
|
|
#22 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi incolli l'header della gui ?
|
|
|
|
|
|
#23 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
eccolo
Codice:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QTimer>
#include "charon.h"
#include "scanport.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
enum Mode { ScanMode, StanbyMode };
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
// Dati
charon *dati;
// Thread
ScanPort *MyPortScanner;
// Funzioni
void SetInterface(Mode);
private slots:
void InitScanner();
void UpdateResult();
};
#endif // MAINWINDOW_H
Codice:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
dati = new charon;
MyPortScanner = new ScanPort(dati);
// Connetto pulsanti e slot
connect(ui->startpushButton,SIGNAL(clicked()),this,SLOT(InitScanner()));
// Connetto eventi del thread e slot
connect(MyPortScanner,SIGNAL(terminated()),this,SLOT(UpdateResult()));
// Setto l'interfaccia
SetInterface(StanbyMode);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::SetInterface(Mode currentmode)
{
switch(currentmode)
{
case ScanMode:
{
ui->startpushButton->setEnabled(false);
ui->stoppushButton->setEnabled(true);
ui->hostlineEdit->setEnabled(false);
ui->sportspinBox->setEnabled(false);
ui->eportspinBox->setEnabled(false);
ui->timeoutspinBox->setEnabled(false);
ui->captionlabel->setText(tr("Scansione di \"%1\"").arg(dati->get_Host()));
break;
}
case StanbyMode:
{
ui->startpushButton->setEnabled(true);
ui->stoppushButton->setEnabled(false);
ui->hostlineEdit->setEnabled(true);
ui->timeoutspinBox->setEnabled(true);
ui->sportspinBox->setEnabled(true);
ui->eportspinBox->setEnabled(true);
ui->captionlabel->clear();
break;
}
}
}
void MainWindow::InitScanner()
{
QTimer time;
//Controllo del campo host name
if(ui->hostlineEdit->text().isEmpty())
{
QMessageBox::information(this,tr("Campo host vuoto"),tr("Devi specificare un indirizzo o un nome FQDN."));
return;
}
//Controllo che il range delle porte sia valido
if(ui->sportspinBox->value() > ui->eportspinBox->value())
{
QMessageBox::information(this,tr("Range di porte non valido"),tr("Il range di porte dichiarato non può essere negativo"));
return;
}
// Preparo dati
dati->set_Sport(ui->sportspinBox->value());
dati->set_Eport(ui->eportspinBox->value());
dati->set_Host(ui->hostlineEdit->text());
dati->set_timeout(ui->timeoutspinBox->value());
// Inizio Thread
SetInterface(ScanMode);
MyPortScanner->run();
}
void MainWindow::UpdateResult()
{
// Guardo nel buffer se ci sono nuovi dati
ui->outplainTextEdit->setPlainText(ui->outplainTextEdit->toPlainText().append(dati->get_BufResult()));
}
tra l'altro è parecchio strano, ora ho inserito anche lo slot per il pulsante "stop", questo lavora correttamente andano ad interrompermi il thread e a chiamare UpdateResult() e SetInterface() che mi aggiorna l'interfaccia in modo corretto. Ora poi..... sono a casa e sul pc di casa.... la gui ha ripreso a non rispondere quando arriva a Thread->run()...
Ultima modifica di Teo@Unix : 21-12-2009 alle 22:24. |
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
debuggando sembra che quando arrivo a thread->run() il programma si comporti come se fosse una fuzione...
|
|
|
|
|
|
#25 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per far partire il thread non devi chiamare il metodo run, ma il metodo start.
|
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Acciderbolina...
funziona! resta il problema che la gui non si accorge che il thread finisce .... ho inserito lo slot per il tasto stop, l'ho fatto in questo modo: sembra ok Codice:
void MainWindow::TerminateScanner()
{
MyPortScanner->wait();
MyPortScanner->terminate();
SetInterface(StanbyMode);
dati->set_BufResult(tr("\n-----> Scansione interrotta dall'utente\n"));
UpdateResult();
}
ecco il codice: header: Codice:
#ifndef SCANPORT_H
#define SCANPORT_H
#include <QThread>
#include <QTcpSocket>
#include <QHostAddress>
#include "charon.h"
class ScanPort : public QThread //Thread ScanPort eseguirà la scansione
{
private:
charon *dati;
public:
ScanPort(charon*); //Costruttore
void run(); //Funzione per la scansione delle porte
};
#endif // SCANPORT_H
Codice:
void ScanPort::run()
{
QTcpSocket sock;
QHostAddress remoteHost;
QHostAddress localHost;
remoteHost.setAddress(dati->get_Host());
localHost = QHostAddress(QHostAddress::LocalHost).toString();
unsigned int curPort;
unsigned int Sport = dati->get_Sport();
unsigned int Eport = dati->get_Eport();
short int timeout = dati->get_timeout();
for(curPort = Sport; curPort <= Eport; curPort++)
{
sock.abort();
sock.connectToHost(remoteHost,curPort);
if(sock.waitForConnected(timeout*1000))
{
dati->set_BufResult(tr("Porta %1 aperta\n").arg(curPort));
}
}
dati->set_BufResult(tr("\n *** Scansione completata *** \n"));
}
|
|
|
|
|
|
#27 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Così funziona:
connect(&thread, SIGNAL(started()), this, SLOT(showMaximized())); connect(&thread, SIGNAL(finished()), this, SLOT(showNormal())); |
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Nel senso che devo usare il segnale finished()? O intendevi un'altra cosa?
edit: mi rispondo da solo, Si devo usare finished(). A questo punto dovrebbe funzionare, mi manca da definire qualcosina, ma posso dire di aver fatto qualcosa che abbia una grafica. Il tuo supporto mi è stato molto d'aiuto. Ti ringrazio per la continua disponibilità. adesso studio Ultima modifica di Teo@Unix : 22-12-2009 alle 13:50. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:55.



















