Programm gibt während einer Schleife keine Rückmeldung
-
Ich habe an einem Albtraum für den Programmierer und Anwender geschrieben xD.
Eine Keygen (nix illegales, für mein eigene Programme)
Und damit "Kann" ich Eine "Map" (so hab ich so genannt) erstellen.
also eine datei mit einem Haufen Keys drin oder viele mit einem oder drei drin (es gehen auch andere Mengen, je nach Wunsch)
Das generieren dauert 0 - ∞ Sekunden (die acht ist das Zeichen für unendlich aber das wisst ihr ja)
Für 500 Keys brauch ich im Durschnitt 30 Minuten (Wie ihr seht SEHR SEHR Lange, ist aber relativ Sicher (für meinen Gebrauch) und generiert bis zu 46! Keys (Fakultät!!!!))Aber jetzt kommt der heiße Brei:
1. Das Prog arbeitet zwar noch aber die ewige Schleife, lässt Windows denken das Prog sei eingefroren, wenn ich minimiere oder das Fenster wechsle.
2. Ein Versuch das mit Refresh und weiteres zu verhindern hat dazu geführt, dass das Prog automatisch das "aktive Fenster" als sich einstellt, ein Schreiben ist nicht mehr möglich weil das Fenster immer den Fokus verliert.
Beides ist zu beheben.
Danke
(Code Schnipsel (nicht Vollständig wegen Sicherheit, ihr versteht)):
void __fastcall TForm1::GeneratorClick(TObject *Sender) { teiler = 0; Feld[1] = 1; Feld[2] = 1; Feld[3] = 1; Feld[4] = 1; combicheck[3] = 0; while (combicheck[3] != 2) { // rausgenommen (rechenoperationen) // aber hier kommt im erforlgreichen Falle 2 raus if (combicheck[3] == 2) { MINUS[1] = gesamt.substr(0,8); MINUS[2] = gesamt.substr(8,16); MINUS[3] = gesamt.substr(24,16); MINUS[4] = gesamt.substr(40,8); MINUS[5] = MINUS[1]; MINUS[5] += " - "; MINUS[5] += MINUS[2]; MINUS[5] += " - "; MINUS[5] += MINUS[3]; MINUS[5] += " - "; MINUS[5] += MINUS[4]; KEY->Text = MINUS[5].c_str(); Label3->Caption = combicheck[1]; Label4->Caption = combicheck[2]; Label5->Caption = combicheck[3]; // Label6->Caption = Feld[4]; } teiler = 0; Label2->Caption = combicheck[3]; Sleep(1); convert << combicheck[3]; convert >> debug; convert.clear(); // MessageBox(NULL,debug.c_str(),"Successfully",MB_OK|MB_ICONQUESTION); wh = 0; gesamt = ""; Feld[1]=0; Feld[2]=0; Feld[3]=0; Feld[4]=0; while (wh < 48) { zeichen = rand()%35; zeichen = zeichen + 1; teiler++; wh++; if (teiler<8) { Feld[1] += zeichen; } if (teiler>8&&teiler<24) { Feld[2] += zeichen; } if (teiler>24&&teiler<40) { Feld[3] += zeichen; } if (teiler>40) { Feld[4] += zeichen; } sswitch (zeichen) { case (1): { outzeichen = "0"; break; } case (2): { outzeichen = "1"; break; } //................
das ist der Genrator und wie ihr euch denken lässt der Mapcreator
das immer wieder aufrufenDanke
-
Pack ein Application->ProcessMessages(); in die Schleife.
Je nach Performance deiner Berechnungen sollte aber ein Aufruf alle 100 oder 1000 Schleifenzyklen ausreichen.Alternativ solltest du die rechenintensiven Sachen in einen eigenen Thread auslagern.
-
Und wie löse ich das mit dem Fokusverlust. Das ist SEHR Nervig, und danke für die funktionierende Lösung.
Ich glaub ich bau die Refreshes und Rebuilds wieder aus, das dürfte das Problem eignetlich beheben.Nein das behebt das Problem nicht, für diesen Satz brauchte ich 2 min ^^.
-
Hallo
Der Fokusverlust ist durch deinen gezeigten Quellcode nicht erklärbar, sowas wird weder von Refresh noch von ProcessMessages verursacht. Dazu müßte man z.B. SetFocus aufrufen, oder MessageBox.
Ich verweise wie Jansen auf TThread.
bis bald
akari
-
Oh Entschuldigung. Natürlich ist der Fokusverlust nicht im Generator zu begründen.
Hier ist der Abschnitt indem das zu Vermuten ist:
~Entschuldigung, der Code ist sehr lang, ich kann aber nichts kürzen, weil es sein könnte, dass ich den Grund rausschneide.~void __fastcall TForm1::Button2Click(TObject *Sender) { // Form1->Height = 384; std::string name; name = RichEdit1->Text.c_str(); int PARTCOUNT = 0; if (name.substr(name.size()-7,7) == ".keymap") { name = name.substr(0,name.size()-7); } if (name.substr(name.size()-8,8) == ".keypart") { name = name.substr(0,name.size()-8); } if (CheckBox1->Checked == true) { name += ".keypart"; } else { // name += " 1"; name += ".keymap"; } ifstream testexi; testexi.open(name.c_str()); ProgressBar1->Max = ScrollBar1->Position; ProgressBar1->Position = 1; int deciss = 6; if (testexi) { deciss = MessageBox(NULL,"Bereits Vergeben, wollen sie überschreiben ?","Bereits Vergeben",MB_YESNO); testexi.close(); } int KEYS = 0; bool Div_Zero = false; if (deciss == 6 && (CheckBox1->Checked == true || (CheckBox1->Checked == false))) { std::string addiert = ""; testexi.close(); ofstream create_and_write; create_and_write.open(name.c_str()); int i; i = 0; float Clear; while (i < ScrollBar1->Position) { i++; if (ScrollBar1->Position <= float(ScrollBar1->Position/7)) { CTrayIcon1->Icons = L1; } if (ScrollBar1->Position <= float(ScrollBar1->Position/6)&&ScrollBar1->Position >= float(ScrollBar1->Position/7)) { CTrayIcon1->Icons = L2; } if (ScrollBar1->Position <= float(ScrollBar1->Position/5)&&ScrollBar1->Position >= float(ScrollBar1->Position/6)) { CTrayIcon1->Icons = L3; } if (ScrollBar1->Position <= float(ScrollBar1->Position/4)&&ScrollBar1->Position >= float(ScrollBar1->Position/5)) { CTrayIcon1->Icons = L4; } if (ScrollBar1->Position <= float(ScrollBar1->Position/3)&&ScrollBar1->Position >= float(ScrollBar1->Position/4)) { CTrayIcon1->Icons = L5; } if (ScrollBar1->Position <= float(ScrollBar1->Position/2)&&ScrollBar1->Position >= float(ScrollBar1->Position/3)) { CTrayIcon1->Icons = L6; } if (ScrollBar1->Position <= float(ScrollBar1->Position/1)&&ScrollBar1->Position >= float(ScrollBar1->Position/2)) { CTrayIcon1->Icons = L7; } CTrayIcon1->Restore(); Clear = i; Label10->Caption = i; if (Clear/75 == i/75) { Form2->RichEdit1->Text = ""; addiert = ""; } std::string thekey__inmap; Generator->Click(); KEYS++; float Calculate = KEYS; if (Calculate / 2 == KEYS / 2) { Application->ProcessMessages(); } if (PARTCOUNT == 0) { PARTCOUNT = 1; } if (CheckBox1->Checked == true && (KEYS == StrToInt(Edit2->Text)+1 || KEYS == int(StrToInt(Edit2->Text)*PARTCOUNT)+1)) { PARTCOUNT++; create_and_write.close(); std::string NewKey = name; bool agree = false; int count_parts = 0; while (agree == false) { ifstream NEW; count_parts++; NewKey = name; NewKey = NewKey.substr(0,NewKey.size()-8); NewKey += " "; NewKey += IntToStr(count_parts).c_str(); NewKey += ".keypart"; NEW.open(NewKey.c_str()); if (!NEW) { agree = true; create_and_write.open(NewKey.c_str()); break; } else { NEW.close(); } NEW.close(); } } thekey__inmap = KEY->Text.c_str(); addiert += thekey__inmap; addiert += "\n"; Form2->RichEdit1->Text = addiert.c_str(); create_and_write << thekey__inmap; create_and_write << "\n"; ProgressBar1->Position = ProgressBar1->Position + 1; Sleep(1); ofstream Progress; std::string Progi = Invertiert; Progi += "Progress.txt"; Progress.open(Progi.c_str()); Progress << IntToStr(ProgressBar1->Position).c_str(); Progress.close(); } ProgressBar1->Position = 1; create_and_write.close(); MessageBox(NULL,"Fertig Map erstellt","Fertig",MB_OK); CTrayIcon1->Icons = BLINK; } else { ShowMessage("Anderen Namen wählen oder Teilungsrate erhöhen, gegebenenfalls müssen sie die Teilung abstellen"); } }
-
HABS GEFUNDEN !!!
Wusste ichs doch dass ich was übersehen habe !!!
CTrayIcon1->Restore();
IST SCHULD !!!