funktionen voruebergehend "sperren"



  • hi

    habe ne frage

    ich habe eine fkt die immer aufgerufen hat, falls ich was trace

    jetzt habe ich einen break button und wenn der geklickt wird, darf nichts mehr getraced werden.

    kann ich die kft. dann voruebergehend deaktivieren??

    habe die fkt uebernommen

    static int CALLBACK OnlineCallBack(int nStatus, strTraceMessageData* pTraceData, void* pWnd);
    

    ich rufe mit START den tracevorgang auf

    wenn ich jetzt break mache ( traced er im hintergrund weiter )

    das kann ich endweder verhindern

    a. ich verhindere die callback fkt
    b. ich "kille" die fkt die in start steht

    kann mir da einer helfen, wie ich das mache

    klar ich kann noch ne variable einfuehren die dann in der startbutton fkt die fkt "deaktiviert" weil die dann true ist oder so

    aber gibs da was besseres?
    ich glabue die callback wird trozdem ausgefuehrt. hmmm

    weare aber trozdem "cool" zu wissen ob man sowas "blocken" kann



  • Nun, ich vermute du hast die Funktion "message mapped" oder? Ich weis zwar nicht wie man eine Funktion aus der Karte dynamisch löscht aber die Idee mit einer neuen Variable könnte in jeden Fall eine optimale Lösung sein... Versuche eine "if" Aussage in die message map hineinzustecken, vielleicht funktioniert es ja - ich habe es noch nie probiert aber dennoch... 😉



  • hm, also ich würde schon sagen, dass das nur über eine globale Variable geht, die Du in der Funktion überprüfst. Nennen wir sie mal (bool) bDoWork. In der Buttonfunktion setzt Du sie true oder false.

    Erste Zeile in der Funktion:

    if (DoWork)
    {
      // Funktion ausführen
    }
    

    Wenn in einer Schleife:

    // vor der Schleife. Falls Du schon einen eigenen Zähler in der Schleife hast, kannst Du auch den nehmen.
    int iloopcount;
    // in der Schleife
    // Botschaften verarbeiten
    if (!DoWork)
       break;
    

    Ich hoffe das war jetzt nicht zu simpel als Antwort, aber ich hab' nur mal aus dem BCB-Lager rübergeschnuppert und mir nicht die Mühe gemacht mir Deine anderen Postings hier anzusehen und Deinen Wissenstand einzustufen. Also nichts für ungut, bitte.
    Ach so, dass mit dem BCB-Lager ist auch der Grund, warum da nur steht // Botschaften verarbeiten. Ich weiß nicht mehr, wíe es mit API-Mitteln geht. Hab' ich verdrängt, im BCB ist's einfach Application->ProcessMessages(); 😉 .

    Grüße



  • hmmm weiss auch nicht wie ich es am besten loesen soll

    jep wird halt so gemacht

    MSG message;
    
    				if (::PeekMessage(&message,NULL,0,0,PM_REMOVE)) 
    				{ 
    					 ::TranslateMessage(&message); 
    					 ::DispatchMessage(&message); 
    				}
    

    das prob ist ich init die externe hardware

    am anfang in der start fkt und am schluss ( wenn halt alles fertig ist dann )

    nRet=InitiateDriver(cNoMode);
    				//::MessageBox(NULL, "Trace Mode disabled", "Tracii", MB_OK);
    

    also koennte ich ja bei break auch nRet=InitiateDriver(cNoMode); machen, dann muss ich wieder alles init. bei atart
    da wird aber auch ne textfile generiert
    dann muss ich das auch unterbinden dass nur das board init. wird und nicht die text
    und so weiter

    deswegen dachte ich ( mach dir keinen stress ) maybe weiss jemand wie ich sowas mache wie

    blablabla_disable(fkt_x);
    
    und dann
    
    balbalbal_enable(fkt_x);
    


  • Ich denke das beste wäre dass du eine variable erschaffst - einen Zeiger, der die Adresse der Funktionen beinhaltet. Du musst dann nur den Zeiger ändern. Z.B. eine globale variable: void (*zeger_zu_fnkt)(parameters)=blabla_enabled; etc.



  • Squeel schrieb:

    Ich denke das beste wäre dass du eine variable erschaffst - einen Zeiger, der die Adresse der Funktionen beinhaltet. Du musst dann nur den Zeiger ändern. Z.B. eine globale variable: void (*zeger_zu_fnkt)(parameters)=blabla_enabled; etc.

    Ich habe ein Paar Fehler gemacht (nicht nur Grammatikalische ;)):

    // Ein Zegier zu einer Funktion (Deklaration)
    int (*funktZeiger) (int Parameter) = (int(__cdecl*)(int Parameter))&blablabla_enabled;
    
    // Ruf der funktion
    (*funktZeiger)((int)EINE_NUMMER);
    

    Ich hoffe es klappt, ich habe es nicht ausprobiert... habe es schon lange nicht benutzt...


Anmelden zum Antworten