!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

Beitrag von slash-ex »

1. Wenn du möchtest, dass dir jemand bei einem Problem behilflich ist, dann solltest du den Ton und die Form deiner Posts überdenken.
War auch nicht böse gemeint. Bei der Form hattet ihr recht :(

Ok, diesmal mit Großschreibung:
Ich hatte mich tatsächlich mit der Schleife vertan... Aber da die nur einmal durchläuft, um das Array zu initialisieren, wird das wohl nich allzuviel ändern.

Code: Alles auswählen

for(int i = 0; i < ln; i++)
      array[i] = 0; 
Ein memset schadet aber auch nicht.


@neuschi:
Danke für das Thread-Beispiel, ich hatte bisher noch nicht wirklich Ahnung wie man QThreads anwenden könnte.(Weil ich bisher auch noch nicht gethreadet habe)
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.
Das ganze Übel fing damit an, als ich gemerkt habe, dass eine Konsolenausgabe das Programm um eine Potenz langsamer gemacht hat und da hats mich interessiert ob man Gui-technisch das ganze nicht schelelr machen könnte, was an sich schwachsinnig ist^^ Aber ich musst es halt machen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

slash-ex hat geschrieben: Das ganze Übel fing damit an, als ich gemerkt habe, dass eine Konsolenausgabe das Programm um eine Potenz langsamer gemacht hat und da hats mich interessiert ob man Gui-technisch das ganze nicht schelelr machen könnte, was an sich schwachsinnig ist^^ Aber ich musst es halt machen.
Das schnellste wenn man die Daten wirklioch ausgeben muss, ist eine Textdatei.
MfG Christian

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

Beitrag von neuschi »

slash-ex hat geschrieben: @neuschi:
Danke für das Thread-Beispiel, ich hatte bisher noch nicht wirklich Ahnung wie man QThreads anwenden könnte.(Weil ich bisher auch noch nicht gethreadet habe)
Gern geschehen. Kommst du damit denn weiter?

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

Beitrag von slash-ex »

Hmm, naja etwas Eigenartiges tritt auf:

Ich habe mir eine Klasse von QThread abgeleitet:

Code: Alles auswählen

class createPw : public QThread
{
private:
	int limes, ln;
	char *cstring;

	char ret_char(int num)
	{
		//a-z
		if(num <= 25 && num >= 0)
			return static_cast<char>(num+97);
		//A-Z
		if(num <= 51 && num >= 26)
			return static_cast<char>(num+39);
		//0-9
		if(num <= 61 && num >= 52)
			return static_cast<char>(num-4);
	}

public:
	//konstruktor
	createPw(int lim, int l, char* adr,  QObject * parent = 0) : limes(lim), ln(l), cstring(adr), QThread(parent)
	{
	}

	//reimplementation
	void run()
	{
		unsigned short array[ln];

		memset(array, 0, ln);

		while(1)		//leider noch unfertig!
		{
			for(int i = ln; i > 0; i--)
				cstring[ln-i] = ret_char(array[i-1]);

			cout<<cstring<<endl;

			int i = 0;
			for(; array[i] == limes; ++i)	
			{
				array[i] = 0;
			}
			++array[i];
		}
	}
};
Wenn ich nun in meiner Funktion den Thread erstellen will:

Code: Alles auswählen

void PwHGui::startPwGen()
{
	QTimer *timer = new QTimer;
	int area;
	if(az == true && azAZ == false && azAZ09 == false && xtra == false)
		area = 25;

	std::cout<<"starte Generator: "<<std::endl;

	currentP = new char[pwLn_beg];
	createPw PwGen(area, pwLn_beg, currentP, this);	//create Thread =>run() wird nicht aufgerufen!!!
	PwGen.start(); 				//stürzt ab mit der meldung das thread schon existiert
	timer->start(250);
	delete [] currentP; 

	connect(timer, SIGNAL(timeout() ), this, SLOT(setLabel() ) );
}
dann stürzt das Programm ab, weil angeblich schon ein Thread läuft... Deswegen habe ich das PwGen.start(); auch mal auskommentiert... und ich bekomme zufällige Werte, weil durch den Timer alle 250ms auf einen auf einen nicht belegten Speicherbereich zugegriffen wird, also kann ich davon ausgehen das run() nicht ausgeführt wird... Aber wie gesagt, wenn ich start() ausführe brichts ab! kurios.

Ich habe auch mal den Konstruktor der Thread-Klasse um ein run(); bereichert. Dann gibt mir die Konsole zwar Passwörter aus, aber die Gui reagiert nicht. Wahrscheinlich wieder irgendwas EventLoops-mäßiges... KA
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

slash-ex hat geschrieben:Hmm, naja etwas Eigenartiges tritt auf:


createPw PwGen(area, pwLn_beg, currentP, this); //create Thread =>run() wird nicht aufgerufen!!!
Bin gerade an einem Non-Qt Rechner, daher kann ichs nicht testen,
aber mal spekuliert: run() wird nicht beim Erstellen des Threads aufgerufen sondern beim start(). Du legst den Thread hier als lokale Variable an, die ihre Gültigkeit verliert, sobald die Methode startPwGen() verlassen wird! Dann wird der Destruktor deines Threads aufgerufen und es ist klar, dass der nicht mehr läuft!
Deswegen habe ich das PwGen.start(); auch mal auskommentiert... und ich bekomme zufällige Werte, weil durch den Timer alle 250ms auf einen auf einen nicht belegten Speicherbereich zugegriffen wird, also kann ich davon ausgehen das run() nicht ausgeführt wird
Ich würde den QThread auf dem Heap anlegen, d.h. mit

Code: Alles auswählen

createPw *PwGen = new createPw(area, pwLn_beg, currentP, this);  
PwGen->start();
Das sollte deine Probleme vermutlich beheben....

\Ralf
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Vielleicht bin ich auch übermüdet und hab was übersehen, aber ich glaube du hast da noch ein Array-Problem (neben dem Performance-Kram):

Code: Alles auswählen

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

   [...]

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

   [...]

      if(strcmp(cstring, str) == 0)                   (3)

   [...]
Bei (2) füllst du den buffer bis zum letzten Zeichen. Gleich dahinter folgt dann das erste Byte des Arrays "array"...
Bei (3) vergleicht dann strcmp bis zum ersten 0 (!). Damit vergleichst du also nicht str mit cstring, sondern str mit cstring+array.

Entweder
* bei (3) strncmp(cstring,str,ln) // strcmp ist eh sch... oder
* bei (1) new char[ln + 1] // initialisierung nicht vergessen.. oder
* beides...
Antworten