Probleme mit GUI bei Berechnung

Alles rund um die Programmierung mit Qt
Antworten
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Probleme mit GUI bei Berechnung

Beitrag von NoRulez »

Hey @all,

Habe ein Problem bei einem Portscanner für unser Firmennetzwerk.

Und zwar sobald ich auf den QPushButton (StartScan) klicke sollten in einem QTreeWidget die Hostnamen inkl. IP-Adressen angezeigt werden.

Da gethostbyaddr nun länger blockiert wenn es diesen Host nicht gibt, dachte ich mir ich lagere diese Funktion in einem QThread aus, der für jeden Host gestartet wird.

Mein Problem ist nun, das obwohl ich threads starte trotzdem die Oberfläche blockiert wird (QTreeWidget, PushButton, usw.)

Kann mir diesbezüglich jemand einen Tip geben, wie ich solche sachen ausführen kann, ohne das jegliche Elemente in meiner GUI blockiert werden?

Lg NoRulez
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Hast Du dir die Examples angeguckt?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Ja und zwar unter: http://doc.trolltech.com/4.0/threads-wa ... tions.html

Ich komme aber trotzdem nicht drauf was ich falsch mache :(

hier mal ein wenig code:
GUI:

Code: Alles auswählen


startScan() {
	.
	.
	std::list<ResolveHosts*> resolve_hosts;
	for(....) {
	.
	.
		QApplication::processEvents();
		ResolveHosts *rh = new ResolveHosts(host_item, current);
		rh->start();
		resolve_hosts.push_back(rh);
	}
	for(std::list<ResolveHosts*>::iterator iter = resolve_hosts.begin();
		iter != resolve_hosts.end();
		++iter) {
		(*iter)->wait();
	}
}

Code: Alles auswählen

#ifndef QNETWORKUTILITIES_H
#define QNETWORKUTILITIES_H

#include <QThread>
#include <QTreeWidgetItem>
class ResolveHosts : public QThread {
	Q_OBJECT

public:
	ResolveHosts();
	ResolveHosts(QTreeWidgetItem *&host_item, unsigned long ip_number);
	~ResolveHosts();
	void run();

private:
	QTreeWidgetItem *item;
	unsigned long ip_number;
	
};
#endif // QNETWORKUTILITIES_H

Code: Alles auswählen

#include "qnetworkutilities.h"
#include "../shared_src/socket.h"
#include "../shared_src/socket_cli.h"
#include "../shared_src/socket_error.h"
#include "../shared_src/utils_generic.h"
#include "../shared_src/netmod.h"
#include "../shared_src/net_utils.h"

#include <QMutex>
#include<QWaitCondition>

QMutex mutex;
const int MaxThreads = 10;
int numUsedBytes = 0;
QWaitCondition bufferNotFull;

ResolveHosts::ResolveHosts() {
}

ResolveHosts::ResolveHosts(QTreeWidgetItem *&host_item, unsigned long ip_number) {
	this->item = NULL;
	this->ip_number = 0;

	this->item = host_item;
	this->ip_number = ip_number;
}

ResolveHosts::~ResolveHosts() {
}

void ResolveHosts::run() {
	mutex.lock();
	++numUsedBytes;

	if (numUsedBytes == MaxThreads)
		bufferNotFull.wait(&mutex);
	mutex.unlock();

	struct hostent *host = NULL;
	struct in_addr addr;
	char* curname = NULL;

	addr.s_addr = ip_number;
	curname = inet_ntoa(addr);
	host = gethostbyaddr((char *)&ip_number, sizeof(struct in_addr), AF_INET);

	std::string resolved = curname;
	try {
		resolved = NetworkModules::resolveHost(curname, false);
	}
	catch(SocketError &e) {
//		QMessageBox::warning(this, "Information", e.what());
	}
	mutex.lock();
	this->item->setText(1, resolved.c_str());
	--numUsedBytes;
	mutex.unlock();
}

Lg NoRulez
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Code: Alles auswählen

   for(std::list<ResolveHosts*>::iterator iter = resolve_hosts.begin();
      iter != resolve_hosts.end();
      ++iter) {
      (*iter)->wait();
   }
Das ist falsch - keine Eventloop, also auch kein Update. Warum überhaupt warten??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten