Hello tout l'monde !

Je viens vers vous en espérant trouver une solution à mon problème.

Je vous explique d'abord mon programme. Il est plutôt simple, je veux pinger 2 @IP simultanément sur la même fenêtre en affichant la ligne qui m'intéresse dans 2 QTextEdit différents. J'ai donc ma classe principale (PingX) et ma classe Ping qui s'occupe de pinger. J'enregistre les résultats dans un fichier de log avec l'heure.

J'utilise un QProcess pour faire mon ping et récupérer le résultat. Les deux pings se faisant simultanément, j'ai d'abord utiliser des QThread avec movetothread(), le problème c'est qu'apparemment il est impossible d'effectuer un QProcess dans un QThread, en effet j'ai le message d'erreur entre thread parent et enfant en sortie + magnifique viol d'accès à la mémoire...

J'ai donc supprimé mes QThread, mais le souci c'est qu'évidement, comme j'utilise waitforfinished() de la classe QProcess pour avoir le résultat, l'IHM freeze...

Comment contourner ce souci ? J'ai effectué de nombreuses recherches, j'ai vu qu'on pouvait utiliser QEventLoop, mais je n'ai pas réussi à l'utiliser.


Dans mon PingX.cpp (slot connecté à un QPushbutton) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void PingX::slt_ExcecuterLigne1()
{
	//th1 = new QThread;
 
	//NumeroLigne1 = ui.textEdit_Numero->toPlainText();
	AdresseIP1 = ui.textEdit_adresse1->toPlainText();
	NumeroRestau = ui.textEdit_Numero->toPlainText();
 
	ping1 = new Ping(NumeroLigne1, AdresseIP1, NumeroRestau);
 
	connect(ping1, SIGNAL(EmettreResultat(QString, int)), this, SLOT(slt_AfficherLigne1(QString, int)));
 
	timer1 = new QTimer;
	connect(timer1, SIGNAL(timeout()), ping1, SLOT(slt_EffectuerTravailPing()));
	//assert(ping1 && "null pointer detected");
	//ping1->moveToThread(th1);
	//assert(th1 && "null pointer detected");
	//th1->start();
	//assert(timer1 && "null pointer detected");
	timer1->start(1000);
}

Dans mon Ping.cpp :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
QString Ping::EffectuerPing()
{
	//Récupération de l'heure et des minutes pour le fichier de logs
	heures = QTime::currentTime().hour();
	minutes = QTime::currentTime().minute();
 
	//QEventLoop waitLoop;
 
	//connect(&ping, SIGNAL(finished(NULL, NULL)), &waitLoop, SLOT(quit()));
 
	//Récupération de la commande complète à effectuer
	CommandeTotale = CommandePing + Adresse; 
 
	//Démarrage du ping
	ping.start(CommandeTotale); 
	ping.waitForFinished(); 
 
	//waitLoop.exec();
	//Récupération du code d'erreur
	coderetour = ping.exitCode();
 
	//Récupération de la réponse complète
	repprovisoir = ping.readAllStandardOutput();
 
	//Création du fichier de log pour le restau et la ligne
	QFile file("R" + NumeroRestau + "_supervision-Ligne" + QString::number(NumeroLigne) + ".txt");
	if (!file.open(QIODevice::Append | QIODevice::Text))
	{
		return resultat;
	}
 
	QTextStream out(&file);
	Heures = QString::number(heures);
	Minutes = QString::number(minutes);
 
	if (coderetour == 0)
	{
		resultat = repprovisoir.replace(QString("Statistiques"), QString(":"));
		resultat = resultat.replace(QString("\n"), QString(" "));
		resultat = resultat.section(":", 1, 2);
		out << Heures + "H" + Minutes + " : " + resultat + "\n";
	}
	else
	{
		resultat = repprovisoir.replace(QString("Statistiques"), QString(":"));
		resultat = resultat.replace(QString("\n"), QString(" "));
		resultat = resultat.section(":", 1, 1);
		out << Heures + "H" + Minutes + " : !!!!!!!!!!!!!!!!!!!!!!!!CONNEXION NOK!!!!!!!!!!!!!!!!!!!!!!!!!! \n" + resultat + "\n";
	}
 
	file.close();
 
	return resultat;
}