Hallo,
also ich möchte nur ungern mein komplettes Programm posten, deshalb zeige ich einen Codeabschnitt, welcher in etwa dem Teil in meinem Programm entspricht:
Gui.h
Code: Alles auswählen
//Gui.h
#ifndef GUI_H
#define GUI_H
#include <QApplication>
#include <QWidget>
#include <QThread>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QMessageBox>
#include "windows.h"
#include "winsock.h"
////////////////////////////////////////////////////////////////////////////////
int WinSockStart();
class Widget_Server_Load : public QWidget
{
Q_OBJECT
private:
QVBoxLayout *vbl_main;
QGridLayout *gl_address;
QHBoxLayout *hbl_security;
QGroupBox *gb_address, *gb_security;
QLabel *l_port, *l_clients_max, *l_password;
QLineEdit *le_port, *le_clients_max, *le_password;
QPushButton *pb_load;
public:
Widget_Server_Load();
~Widget_Server_Load();
public slots:
void UpLoad();
};
////////////////////////////////////////////////////////////////////////////////
class Transfer : public QThread
{
private:
char pswd[20];
int port;
int clients_max;
SOCKET sock_main;
public:
Transfer(char t_password[20], int t_port, int t_clients_max, SOCKET t_sock_main);
~Transfer();
void run();
};
struct Client
{
SOCKET sock;
char name[30];
bool logmode;
};
#endif
Gui.cpp
Code: Alles auswählen
//Gui.cpp
#include "Gui.h"
#include "Strings.h"
#include "File.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---Konstruktor---
Widget_Server_Load::Widget_Server_Load()
{
vbl_main = new QVBoxLayout(this);
gl_address = new QGridLayout;
hbl_security = new QHBoxLayout;
gb_address = new QGroupBox("Adresse");
gb_security = new QGroupBox("Sicherheit");
l_port = new QLabel("Port: ");
l_clients_max = new QLabel("Maximale Benutzerzahl: ");
l_password = new QLabel("Passwort: ");
le_port = new QLineEdit;
le_clients_max = new QLineEdit;
le_password = new QLineEdit;
le_password->setEchoMode(QLineEdit::Password);
pb_load = new QPushButton("Hochladen");
gl_address->addWidget(l_port, 0, 0, 1, 1);
gl_address->addWidget(l_clients_max, 1, 0, 1, 1);
gl_address->addWidget(le_port, 0, 2, 1, 1);
gl_address->addWidget(le_clients_max, 1, 2, 1, 1);
hbl_security->addWidget(l_password);
hbl_security->addWidget(le_password);
gb_address->setLayout(gl_address);
gb_security->setLayout(hbl_security);
vbl_main->addWidget(gb_address);
vbl_main->addWidget(gb_security);
vbl_main->addWidget(pb_load);
connect(pb_load, SIGNAL( clicked() ), this, SLOT( UpLoad() ) );
setWindowTitle("Server hochfahren");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---Destruktor---
Widget_Server_Load::~Widget_Server_Load()
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---UpLoad---
void Widget_Server_Load::UpLoad()
{
QString port1 = le_port->text(), clients_max1 = le_clients_max->text(), pswd1 = le_password->text();
bool ok;
int port = port1.toInt(&ok, 10);
if((!ok) || (port < 1) || (port > 65000) || (!port))
{
QMessageBox::information(this, "Fehler", "Es wurde ein ungültiger Port eingegeben!", QMessageBox::Ok);
return;
}
int clients_max = clients_max1.toInt(&ok, 10);
if((!ok) || (clients_max < 1) || (!clients_max))
{
QMessageBox::information(this, "Fehler", "Ungültige Eingabe!", QMessageBox::Ok);
return;
}
char pswd[20];
strncpy(pswd, pswd1.toLatin1(), strlen(pswd1.toLatin1()));
if(strlen(pswd) >= 20)
{
QMessageBox::information(this, "Fehler", "Das Passwort ist zu lang (Max. 20 Zeichen)!", QMessageBox::Ok);
return;
}
pswd[strlen(pswd) + 1] = '\0';
SOCKADDR_IN server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = ADDR_ANY;
SOCKET sock_main;
long handle;
handle = WinSockStart();
if(handle == SOCKET_ERROR)
{
QMessageBox::information(this, "Fehler", "WinSock konnte nicht gestartet werden (Code: 0001)!", QMessageBox::Ok);
return;
}
sock_main = socket(AF_INET, SOCK_STREAM, 0);
if(sock_main == INVALID_SOCKET)
{
QMessageBox::information(this, "Fehler", "Socket konnte nicht erstellt werden (Code: 0002)!", QMessageBox::Ok);
return;
}
handle = bind(sock_main, (SOCKADDR*)&server, sizeof(SOCKADDR));
if(handle == SOCKET_ERROR)
{
QMessageBox::information(this, "Fehler", "Socket konnte nicht an Port gebunden werden (Code: 0003)!", QMessageBox::Ok);
return;
}
handle = listen(sock_main, clients_max);
if(handle == SOCKET_ERROR)
{
QMessageBox::information(this, "Fehler", "Fehler beim Aufruf von Funktion 'listen' (Code: 0004)!", QMessageBox::Ok);
return;
}
QMessageBox::information(this, "Upload", "Server wurde erfolgreich gestartet!", QMessageBox::Ok);
Transfer trans_loop(pswd, port, clients_max, sock_main);
trans_loop.start();
//--------->hier ist die alles entscheidende Zeile von der alles abhängt! (**)
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---WinSockStart---
int WinSockStart()
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,2), &wsa);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---Transfer---
Transfer::Transfer(char t_password[20], int t_port, int t_clients_max, SOCKET t_sock_main)
{
strncpy(pswd, t_password, strlen(t_password));
pswd[strlen(pswd) + 1] = '\0';
port = t_port;
clients_max = t_clients_max;
sock_main = t_sock_main;
return;
}
Transfer::~Transfer()
{
}
void Transfer::run()
{
while(1)
{
QMessageBox::information(0, "Thread", "Schleifendurchlauf..", QMessageBox::Ok);
}
return;
}
Wenn ich nun das Programm so komile und in die auskommentierte Zeile (**) nichts schreibe, so gibt er beim Klicken des Hochladen-Buttons die Erfolgsmeldung aus, und sobald man dann mit "Ok" bestätigt, kommt eine Windows-Fehlermeldung: "Es ist ein Programmfehler aufgetreten...blablabla ... Problembericht senden - nicht senden..." - Man kennt diese Fehlermeldung ja.
Wenn ich stattdessen in die auskommentierte Zeile (**) den Befehl "trans_loop.wait()" schreibe, so reagiert er nach dem Klicken des Buttons "Hochladen" + anschließendem Bestätigen der MessageBox nicht mehr. Die Erfolgsmessagebox sowie das Hauptfenster bleiben disalbed und man muss das Programm mit dem Task-Manager schließen....
Wenn ich jedoch in der auskommentierten Zeile (**) eine weitere QMessageBox ausgeben lasse, ganz egal was für eine, so erscheint diese auch nach der Erfolgsmessagebox, und wenn ich diese dann mit "Ok" bestätige, so läuft das Programm zum ersten Mal so wie ich es wollte (naja fast!). Es kommen dann ständig die MessageBoxen aus der Thread-Schleife, jedoch kann ich immernochnicht zum Hauptfenster zurückkehren, denn dieses, sowie die willkürlich gewählte 2. Messagebox sind weiterhin disabled.
Kann mir das jemand erklären??
Grüße
Gapa