Seite 1 von 1
Probleme mit GUI bei Berechnung
Verfasst: 17. Oktober 2007 16:20
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
Verfasst: 17. Oktober 2007 16:45
von macman
Hast Du dir die Examples angeguckt?
Verfasst: 17. Oktober 2007 17:48
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
Verfasst: 18. Oktober 2007 07:48
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??