!absturz? bei einer etwas aufwändigen schleife...

Alles rund um die Programmierung mit Qt
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

!absturz? bei einer etwas aufwändigen schleife...

Beitrag von slash-ex »

Code: Alles auswählen

#include <QtGui>

#include "PwHGui.h" 
#include "PwHCore.h"
#include <iostream>

double std_ops=0;
//time_t stamp = time(0);

void PwHGui::get_Pw(int limes, char* str)
{
	unsigned short ln = strlen(str);
	char *cstring = new char[ln];
	unsigned short array[ln];

	for(int i = 0; i < ln; i++)
		array[i] = 0;

	//while (time (0) <= stamp);  // Aktuelle Sekunde fertig abwarten
	while(/*time (0) <= stamp + 1*/1)
	{
	std_ops++;

		for(int i = ln; i > 0; i--)
			cstring[ln-i] = ret_char(array[i-1]);

		//cout<<cstring<<endl;
		//ui.currentPw->setText("hallo");
		cPW = cstring;

		if(strcmp(cstring, str) == 0)		//funktion beenden wenn passwd übereinstimmt
		{
			cout<<"gefunden: "<<cstring<<endl;
			delete [] cstring;
			break;
		}

		int i = 0;
		for(; array[i] == limes; ++i)		//rücksetzen der ziffern
		{
			array[i] = 0;
		}
		++array[i];
	}
}

PwHGui::PwHGui(QDialog *parent) : QDialog(parent)
{
	az = true;
	azAZ = false;
	azAZ09 = false;
	xtra = false;

	ui = new Ui::PwH;
	ui->setupUi(this);
	connector();
}

void PwHGui::connector()
{
	timer = new QTimer;
	connect(timer, SIGNAL(timeout() ), this, SLOT(setLabel() ) );
	timer->start(100);

	connect(ui->spinBox_beg,  SIGNAL(valueChanged(int) ), ui->spinBox_end, SLOT(setValue(int) ) );

	connect(ui->pushButton_start,  SIGNAL(pressed() ), this, SLOT(startPwGen() ) );
	connect(ui->spinBox_beg,  SIGNAL(valueChanged(int) ), this, SLOT(setPwLnBeg(int) ) );
	connect(ui->spinBox_end,  SIGNAL(valueChanged(int) ), this, SLOT(setPwLnEnd(int) ) );
}

void PwHGui::setPwLnBeg(int z)
{
	pwLn_beg = z;
}

void PwHGui::setPwLnEnd(int z)
{
	pwLn_end = z;
}

void PwHGui::setLabel()
{
	ui->currentPw->setText(cPW);
	timer->start(100);
}

void PwHGui::startPwGen()
{
	int area;
	if(az == true && azAZ == false && azAZ09 == false && xtra == false)
		area = 25;
//...
	std::cout<<"starte Generator: "<<std::endl;
	get_Pw(area, "autobahn");
}
ich habe eine schleife gemacht.... (ganz am anfang) die dauert ne weile bis sie fertig ist, mein problem ist, dass ich die zwischenschritt gerne ausgeben will, und zwar auf ein textlabel! aber leider wird das label erst aktualiesiert wenn die schleife durchgerechnet ist. während der rechnung ist die gui unbenutzbar, als wäre das prg abgestürzt! warum?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das hatten wir schon öfter.
Der Grund ist ganz einfach -die Eventloop wird zwischendurch nicht aufgerufen. Also entweder QThread oder die Eventloop von Hand aufrufen.

Ausserdem -> Forum-Suche!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ok danke... aber irgendwie ist das ganze sau lahm. ich wollte wieder auf meine wenigstens 200 mio durchgänge in der sekunde kommen. auch wenn das mit setLabel wohl schwierig wird.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da stellt sich die Frage - wie soll das jemand lesen können? :roll:
Manchmal denke ich ihr habt keinen Bezug zur Realität :)

Ausserdem ist die Schleife, so wie sie ist, gar nicht dafür ausgelegt und auch der restliche Code ist irgendwie nicht für Geschwindgkeit geschrieben...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

echt? wie willst du denn diese schleife noch optimieren??? der flaschenhals ist höchstens die ausgabe, oder die weiterverarbeitung.

Code: Alles auswählen

void get_nmb(int limes, int ln, char* str)
{
	//unsigned short ln = strlen(str);
	char *cstring = new char[ln];
	unsigned short array[ln];

	for(int i = 0; i < ln; i++)
		array[i] = 0;

	//while (time (0) <= stamp);  // Aktuelle Sekunde fertig abwarten
	while(/*time (0) <= stamp + 1*/1)
	{
	//std_ops++;

		for(int i = ln; i > 0; i--)
			cstring[ln-i] = ret_char(array[i-1]);

		cout<<cstring<<endl;
		str = cstring;
		//cout<<cstring<<endl;
/*
		if(strcmp(cstring, str) == 0)		//funktion beenden wenn passwd übereinstimmt
		{
			cout<<"gefunden: "<<cstring<<endl;
			delete [] cstring;
			break;
		}
*/
		int i = 0;
		for(; array[i] == limes; ++i)		//rücksetzen der ziffern
		{
			array[i] = 0;
		}
		++array[i];
	}
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das null-Setzen ist wohl eher ein Fall für memset
Des weiteren sehe ich keinen Sinn in der Funktion - kein Rückgabewert weit und breit :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

durchgänge mit memset:
2.32692e+07
2.33148e+07

ohne:
1.98997e+07
2.0471e+07

nicht schlecht! leider mit fehlverhalten... mal schauen, um die rückgabe kümmere ich mich schon...
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

slash-ex hat geschrieben: nicht schlecht! leider mit fehlverhalten... mal schauen, um die rückgabe kümmere ich mich schon...
Wenn du Lust hast schick mir das Programm doch mal zu, mal sehen, wie man das noch tunen kann. Ich wette, da sind dann noch einige zig Prozente drin.....

\Ralf
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

gerne hier src. das mit eventloop funktioniert noch nicht, weil ich dazu eine funktion zu nem member machen müsste... ka warum das nicht auch so funktioniert?!

also, an sich wollte ich nen algo machen der so schnell wie möglich passwörter generiert, der algo macht auch (wenn ich das cout weglasse) ca 2*10^7, das prob wird sein, nachher wenn ich streame auch nur annähernd so viele durchzubekommen und im moment auch das ganze schnell auszugeben. eigentlich sollte das genze nur ein test sein, um herauszufinden wie lange es wohl dauert ein pw von meinem vorlesungsscript zu entschlüsseln und vorallem wie schnell ich das mit nem eigenen algo hinbekomme ; es wäre wirklich toll wenn von den 2 miarden operationen noch was übrig bleibt...

allein eine konsolen ausgabe senkt das ganze schon auf nen mio-ner berich...
Dateianhänge
QPWH.tar.gz
(4.97 KiB) 99-mal heruntergeladen
Zuletzt geändert von slash-ex am 5. Juni 2007 21:55, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Die Ausgabe irgendwohin ist hier eindeutig der Bremsklotz. Egal ob auf GUI oder Konsole...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

Hallöchen,
slash-ex hat geschrieben: ... und im moment auch das ganze schnell auszugebeneigentlich sollte das genze nur ein test sein, um herauszufinden wie lange es wohl dauert ein pw von meinem vorlesungsscript zu entschlüsseln und vorallem wie schnell ich das mit nem eigenen algo hinbekomme
Wie schon jemand hier im Forum in seiner Signatur bemerkt hat: Gross- und Kleinschreibung hat durchaus ihren Sinn, auch die Verwendung von Satzzeichen erhöht die Lesbarkeit eines Textes enorm.
Das hat nix mit "spiessig" oder "uncool" zu tun, aber wer täglich gezwungen ist, viele Texte schnell zu lesen und zu verstehen weiss, was ich meine.

So einen unstrukturierten Text wie oben muss man mehrmals lesen und weiss dann immer noch nicht, ob man ihn richtig verstanden hat.

Ich gucke mir das Programm nachher mal an und jage es durch einen Profiler, mal schauen was dabei herauskommt.
Ich habe aber immer noch nicht verstanden, warum die Millionen/Milliarden erzeugten Passwörter überhaupt ausgegeben werden sollen!?
Ausgabeoperationen sind immer langsam, verglichen mit Operationen im Speicher.

Erkläre bitte nochmal kurz, was du genau erreichen möchtest.

Gruß, Ralf
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Er möchte wahrscheinlich einen 'Passwortknacker' bauen, hat das Prinzip aber nicht ganz verstanden...
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

upsala hat geschrieben:Er möchte wahrscheinlich einen 'Passwortknacker' bauen, hat das Prinzip aber nicht ganz verstanden...
So habe ich das auch gesehen, aber beim Blick in den Code fürchte ich, das wird so nix...

Der Tipp mit "memset" war ja gut, aber ist wohl nicht ganz durchgedrungen:

Code: Alles auswählen

 for(; array[i] == limes; ++i)		//rücksetzen der ziffern
{
	//array[i] = 0;			//nimmt sich performance technisch n. viel... messung war wohl ein fehler ):
	memset(&array[i], 0, 1 );	//oder so
}
++array[i];
Nur ein einzelnes Byte mit memset auf 0 zu setzen ist natürlich nicht der Sinn.
Gemeint war folgendes:
Ersetze

Code: Alles auswählen

for(int i = 0; i < ln; i++)
		array[i] = 0;
durch

Code: Alles auswählen

memset( &array, 0, ln);
Der Sinn der Schleife

Code: Alles auswählen

for(; array[i] == limes; ++i)
erschliesst sich mir auch nicht.

Wie gesagt, beschreibe mal mit eigenen Worten, was das Programm leisten soll.

\Ralf
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

hmm, das ist schwachfug... und würde best nicht funktionieren, und was die schleife macht eigentlich klar!

ich lasse einfach alle möglichen kombis durchlaufen also

000
001
...
0 0 26 => array[¹]++ && array[2] = 0
..
010
011
012
...

und weil es ja bei bsp-weise einem satz kleinbuchstaben 26^3 möglichkeiten bei nem 3er wort gibt muss man irgendwann einmal einen index zurücksetzen damit man alle kombis durchprobiert.

usw dann wird der kram in chars umgewandelt, was auch alles ziemlich trivial ist. was mich nur etwas stört, und was man auch leichter nachvollziehen könnte wenn man die datei aus meinem beitrag ausprobiert hätte, ist: dass das ganze SAU lahm wird, wenn ich die ausgabe in ein label packe... meine frage ist nur gewesen ob man das nicht schneller hinkriegt?
die antwort ist: wahrscheinlich nicht.

ich fands nur stylisch, wahrscheinlich ist die idee wirklich scheiße und man solltes lassen.

@upsula: das prinzip funktioniert: ich habe das bewusst ins qtfprum gestellt weil ich einen weg gesucht eine schnellere ausgabe zu machen als sie bisher möglich ist. das ganze in ein konsolenprogramm zu stecken ist schon längst passiert. aber darum geht es mir auch gar nicht.... und ich finds etwas lächerlich ein ganzes array null setzen zu wollen, wenn man rein mathemathisch gesehen mal zum ende kommen will. die schleife setzt bewusst immer nur einen index null.
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

slash-ex hat geschrieben:hmm, das ist schwachfug... und würde best nicht funktionieren, und was die schleife macht eigentlich klar!
Also jetzt mal langsam mit den jungen Pferden.
1. Wenn du möchtest, dass dir jemand bei einem Problem behilflich ist, dann solltest du den Ton und die Form deiner Posts überdenken.

2. Darfst du nicht vergessen, dass du viel tiefer in deinem Programm drinsteckst als wir. Aussagen wie "was die Schleife macht ist eigentlich klar" helfen nicht weiter.
Ich werde hier für andere Arbeiten bezahlt und kann nur zwischendurch mal ein paar Minuten für solche Sachen verwenden. Durch einen nicht dokumentierten und mit ungünstigen Variablennamen versehenen Code durchzusteigen ist dann nicht so einfach.

3. Was bitte ist daran "Schwachfug", wenn man deine Schleife

Code: Alles auswählen

for(int i = 0; i < ln; i++)
		array[i] = 0; 
die alle Werte auf 0 setzt durch ein memset() ersetzt.

Das was du gemacht hast, nämlich die Stelle wo nur ein Index auf 0 gesetzt wird durch memset zu ersetzen ist -wenn du es so nennen willst - "Schwachfug".

Warum du auf der einen Seite mehrere Millionen Passwörter durchprobieren willst, auf der anderen Seite die auch anzeigen möchtest wird wohl dein Geheimnis bleiben.
Mehr als 25 Worte pro Sekunde könnte das menschliche Auge sowieso nicht erkennen.

Deine erste Idee, bspw. einmal pro Sekunde ein Wort anzuzeigen, damit der User einen Fortschritt sieht, ist gar nicht so schlecht und der Ansatz über einen QTimer ist auch richtig.

Was dir noch fehlt um das Gui reaktionsfähig zu halten ist ein Thread.

Guck dir mal folgendes an:

Code: Alles auswählen

#include <QtGui>

QString s;
QMutex mutex;

class CreateData : public QThread
{
public:
    void run()
    {
    int counter = 0;
	    while(1)
	    {
	    counter++;
	    for (int a1 = 0; a1 <=99; a1++)
		    for (int a2 = 0; a2 <=99; a2++)
			    for (int a3 = 0; a3 <=99; a3++)
			    {
				    mutex.lock();
				    s = QString("Durchgang: %1 Wert: %2-%3-%4").arg(counter).arg(a1).arg(a2).arg(a3);
				    mutex.unlock();
			    }
	    }
    }
};

class Displayer : public QDialog
{
Q_OBJECT
public:
	Displayer(QWidget *parent=0)  : QDialog(parent)
	{
		QLabel *label = new QLabel("Current Value: ", this);
		editor = new QLineEdit(this);
		QGridLayout *layout = new QGridLayout(this);
		layout->addWidget(label);
		layout->addWidget(editor);
		setLayout(layout);
		QTimer *t = new QTimer(this);
		t->setInterval(1000);
		connect (t, SIGNAL(timeout()), this, SLOT(sl_update()));
		t->start();
	}

public slots:	
	void sl_update()
	{
		mutex.lock();
		editor->setText(s);
		mutex.unlock();
	}
	
private:
	
	QLineEdit *editor;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv); 
    CreateData CreateData;
    Displayer d;
    d.show();
    CreateData.start();
    return app.exec();
    
}
#include "main.moc"
usw dann wird der kram in chars umgewandelt, was auch alles ziemlich trivial ist.
Das wäre trivialer, wenn statt der Konstanten ein paar "sprechende" #defines dort stünden.
was man auch leichter nachvollziehen könnte wenn man die datei aus meinem beitrag ausprobiert hätte, ist: dass das ganze SAU lahm wird, wenn ich die ausgabe in ein label packe... meine frage ist nur gewesen ob man das nicht schneller hinkriegt?
die antwort ist: wahrscheinlich nicht.
Doch, siehe oben, vorausgesetzt du willst nicht wirklich *jedes* Wort ausgeben.
und ich finds etwas lächerlich ein ganzes array null setzen zu wollen, wenn man rein mathemathisch gesehen mal zum ende kommen will. die schleife setzt bewusst immer nur einen index null.
Davon hat auch keiner gesprochen.

Btw: ist deine Shift-Taste kaputt?

\Ralf
Antworten