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
Probleme mit GUI bei Berechnung
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:
Lg NoRulez
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();
}
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Code: Alles auswählen
for(std::list<ResolveHosts*>::iterator iter = resolve_hosts.begin();
iter != resolve_hosts.end();
++iter) {
(*iter)->wait();
}
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung