dauerhafte mysql datenanbindung



  • Hallo,
    ich habe ein Programm geschrieben, womit man auf LANs Pizza bestellen sollen kann, es greift über diese mysqldac komponente auf eine mysql datenbank zu, nur leider macht das programm dies ständig...
    Also die Abfragen die es durchführt dauert ca. 2-3 sekunden, ich kann das programm also 2-3 sekunden nicht benutzen und es scheint abgestürzt zu sein (integrierte Uhr bleibt auch stehen)
    nach dieser zeit springt die uhr dann wieder auf die aktuelle zeit und hängt wieder für 2-3 sek.

    wie kann ich das am einfachsten machen, das ich das programm ständig nutzen kann, also das programm nicht ständig auf die datenbank zugreift (also nur alle 2 minuten oder so) oder das dieser datenbankzugriff im hintergrund passiert

    ich hänge einfach mal meinen code hinterher, vll ist da ja schon ein dicker fehler drinne...

    query_catering->Active=false;
    query_catering->SQL->Clear();
    query_catering->SQL->Add("select * from catering_zeiten where nr=1");
    query_catering->Active=true;
    
    if(query_catering->IsEmpty()==false)
    {
    lab_cat_best_1->Visible=true;
    lab_cat_zziel_1->Visible=true;
     lab_cat_status_1->Visible=true;
     chk_cat_best_1->Visible=true;
     chk_cat_best_1->Enabled=true;
     lab_cat_verbleibend_1->Visible=true;
    
    lab_cat_best_1->Caption=query_catering->FieldByName("tag")->AsString+", "+ query_catering->FieldByName("bestellung")->AsString+" Uhr";
    lab_cat_zziel_1->Caption=query_catering->FieldByName("endzeit")->AsString+" Uhr";
    AnsiString cat_stauts1 = query_catering->FieldByName("status")->AsString;
    AnsiString cat_status_text1;
    if(cat_stauts1==0) cat_status_text1="Bestellung Beendet";
    else if(cat_stauts1==1) cat_status_text1="Bestellung Aktiv";
    else if(cat_stauts1==2) cat_status_text1="Bestellung Inaktiv";
    else if(cat_stauts1==3) cat_status_text1="Bestellung Geschlossen";
    lab_cat_status_1->Caption=cat_status_text1;
    
    if(wochentag!=query_catering->FieldByName("tag")->AsString)
    {
    chk_cat_best_1->Enabled=false;
    lab_cat_verbleibend_1->Caption="nicht heute...";
    }
    else
    
    if(chk_cat_best_1->Checked==true)
    {
    //jetzt passierts...
    
    AnsiString bestellung_1=query_catering->FieldByName("bestellung")->AsString;
    
    struct  time t;
       gettime(&t);
    AnsiString now_minuten = t.ti_min;
    AnsiString now_stunden = t.ti_hour;
    
    AnsiString best_stunden_1=bestellung_1.SubString(1,2);
    AnsiString best_minuten_1=bestellung_1.SubString(5,2);
    
    AnsiString verb_stunden_1=best_stunden_1-now_stunden-1;
    AnsiString verb_minuten_1="60"-now_minuten;
    
    AnsiString verbmin_1=verb_stunden_1*60+verb_minuten_1;
    lab_cat_verbleibend_1->Caption=verbmin_1+" Minuten";
    
    //da solls nu wecken...
    ;
    if(verbmin_1==ed_cat_wecken->Text && lab_cat_muss_1->Caption=="haha")
    {
           TrayIcon1->Restore();
           sndPlaySound("werwardas.wav",SND_FILENAME|SND_SYNC);
           TabbedNotebook1->ActivePage="Catering";
           lab_cat_muss_1->Caption="hoho";
    }
    
    }
    else lab_cat_verbleibend_1->Caption="nicht aktiviert";
    }
    else
    {
     lab_cat_best_1->Caption="Keine Bestellungen";
     lab_cat_zziel_1->Visible=false;
     lab_cat_status_1->Visible=false;
     chk_cat_best_1->Visible=false;
     lab_cat_verbleibend_1->Visible=false;
    }
    

    und das ganze passiert insgesammt 8 mal, für 8 verschiedene zeiten wo man pizza bestellen kann...

    ich hoffe irgendjemand kann mir weiterhelfen und in diesem sinne schonmal danke
    Christian



  • Deinen Erklärungen kann ich nicht folgen. Zumindest steht der gezeigte Code in keinem offensichtlichen Zusammenhang mit den von dir beschriebenen Problemen.
    Viel wichtiger wäre, zu wissen, wann und wie genau du den Code aufrufst.

    Und in Zukunft bitte die "C++"-CodeTags verwenden. Danke!



  • ich rufe diesen code mit laden der hauptform, also quasi zu beginn auf.
    Wenn das Programm also startet, wird eine verbindung zur datenbank hergestellt (ist nicht hier im code vorhanden) und im prinzip direkt darunter im quelltext beginnt der gepostete abschnitt mit der 1. Abfrage...

    sinn ist es aus der datenbank die verschiedenen zeiten rauszubekommen, wann man eine pizza bestellen kann und ob eine bestellung aktiv oder inaktiv bzw. schon vorbei ist.

    das problem ist einfach, das die abarbeitung dieses teil des codes viel zu lange dauert und das programm dadurch "hängt", ich will es nun irgendwie hinbekommen, das das programm immer flüssig weiter läuft, mann aber immer (oder zumindest alle paar minuten) eine aktualisierte ansicht erhält...

    und was genau meinst du jetzt mit C++ Code Tags? ich bin leider nicht so bewandert mit einigen fachausdrücken 😉


  • Mod

    Hallo

    Tip -> Threads

    MfG
    Klaus



  • danke guter tip, nur leider sagt mir das überhaupt nichts, sorry 😃



  • Wieso dauern die DB-Abfragen denn überhaupt so lange? Welche DB wird verwendet? Schon mal einen Query-Analyzer eingesetzt, um zu prüfen, ob vielleicht irgendein Index fehlt, oder ungünstig gesetzt ist?



  • Wenn Du die Datenbankabfragen in Threads ausführst, läuft das Hauptprogramm weiter. Schau mal in die BCB Hilfe zu TThread.



  • ne nen query analyzer hab ich nicht benutzt... kann man sich das irgendwo runterladen??
    ich benutze mysql, keine ahnung welche version und wiso die abfragen so lange dauern hab ich auch keine ahnung, hatte ja gehofft hier eine antwort zu finden


  • Mod

    Hallo

    wenn du mit Threads nicths anfangen kannst
    warum nicht einfach im BCB Threads eingeben und dann F1 -> lesen, lesen...

    MfG
    Klaus



  • Hallo nochmal,
    danke erstmal für die tips, auch wenn sie mir nix gebracht haben 😉
    ich habe übersehen das ich meine tolle uhr im programm sich über einen timer immer neu synchronisiert und im ontimer ereigniss habe ich formcreate ausgewählt, daher hat das programm dann auch ständig rumgezickt...

    ich hab den timer jetzt nur auf die uhr "angepasst" und alles läuft wunderbar 😮


Anmelden zum Antworten