If-Abfrage innerhalb der DLL / Timer



  • Hallo Gemeinde,

    ich verzweifele gerade an einem eher banalem Thema - eine IF-Abfrage innerhalb einer zu exportierenden DLL Funktion und an einem Timer.

    Der Einfachheit halber nachfolgend der Quellcode der DLL "EXPORT":

    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    
    #define _USE_MATH_DEFINES 
    #include <math.h>
    
    typedef void (_cdecl *CTRL)(double*, double*);
    typedef void (_cdecl *INIT)(double*, double*);
    
    double input_array1[101];
    double output_array1[101];
    
    double input_array2[101];
    double output_array2[101];
    
    int counter;
    
    extern "C" 
    {void __declspec(dllexport) __cdecl EXPORT(float *var1,int *var2, char *var3, char *var4, char *var5);}
    
    void __declspec(dllexport) __cdecl EXPORT(float *var1,int *var2, char *var3, char *var4, char *var5)
    
    {
    
    INIT call_dll1_function1, call_dll2_function1;
    CTRL call_dll2_function2, call_dll2_function2;
    
    HINSTANCE hinstlib_dll1= LoadLibrary(L"dll1.dll");
    HINSTANCE hinstlib_dll2= LoadLibrary(L"dll2.dll");
    
    if (hinstlib_dll1 != NULL && hinstlib_dll2 != NULL && counter <10)
    
    {
    
     sprintf(var5,"%d",counter);
    }
    
    counter++;
    
    }
    

    1. Problem

    Innerhalb der zu exportierenden Funktion "EXPORT" sollen also Function zweier anderer DLLs (DLL1 + DLL2) eingebunden werden. Dies klappt auch ganz gut, es scheint zu klappen.

    Var5 ist eine Anzeige, die man während dem Aufruf beobachten kann.

    If würde gerne die ersten 10 Aufrufversuche überwachen, und mir diese ausgeben

    sprintf(var5,"%d",counter)
    

    Folgendes passiert:

    er zählt von 1 bis 9 und bleibt dann aber bei 9 stehen und gibt fortlaufend 9er aus - intern zählt der Counter aber weiter.
    Was muss ich ändern, damit nur die ersten 10 ausgegeben werden?

    2. Problem

    Die beiden DLLs (DLL1 und DLL2) sollen unterschiedlich getaktet angesprochen werden.

    z.b. alle 0.1s für DLL1 und alle 0.01s für DLL2.

    Vom Programm her kann ich nur eine Vorgabe für die übergeordnete DLL machen (mit der zu exportierenden Funktion "EXPORT").

    Also wäre es sinnvoll, diese mit 0.01s anzusprechen, was i.O. für DLL2 wäre und dann eine Art Zählschleife (z.B. alle 10 Takte rufe auch DLL1 auf).



  • Was ist eine IF-Schleife?



  • 1.) Es gibt keine If-Schleifen
    2.) Mit welchem wert wird counter initialisiert?
    3.) Die Bedingung in der Verzweigung von counter<10 auf counter<=10 aendern.



  • Der darf da eigentlich nicht fehlen 😉
    http://www.if-schleife.de/



  • Asche auf mein Haupt - ein dicker Patzer das mit der If-Abfrage.
    (auch wenn die DLL sich in meinem Fall wie eine Schleife verhält 😡 )

    ist geändert.

    leider ist es völlig unabhängig, ob ich den counter mit =0 oder nicht initialisiere.

    Auch ein <= 10 bringt keiner besserung - er zählt dann eben bis 10 und spuckt fortlaufend 10er aus.

    für weitere vorschläge bin ich dankbar.



  • Der counter wird ja auch immer weiter hochgezählt, aber ab 10 nicht mehr in var5 geschrieben. Was du dann mit var5 in der aufrufenden Funktion machst, können wir nicht sehen. Aber anscheinend gibst du einfach var5 immer weiter aus (keine Ahnung, wie da die Abbruchbedingung ist bzw. ob es eine gibt).



  • workaround ist momentan einfach in der nächsten Zeile ein

    if (counter >10)
    {
    strcpy_s(var5,64,"");
    }
    

    einzubauen.

    Gibt es Ideen für das 2. Problem (zeitversetzes Ansteuernd der DLLs)?



  • DampfHans schrieb:

    workaround ist momentan einfach in der nächsten Zeile ein

    if (counter >10)
    {
    strcpy_s(var5,64,"");
    }
    

    einzubauen.

    Ich weiß ja nicht so recht, was genau du vorhast, aber: wieso ein Workaround? Wieso implementierst du nicht das gewünschte Verhalten an der aufrufenden Stelle? Wenn dort nur 10 Mal die Dll-Funktion aufgerufen werden soll, dann programmier es doch einfach dort.

    DampfHans schrieb:

    Gibt es Ideen für das 2. Problem (zeitversetzes Ansteuernd der DLLs)?

    Du willst 2 Funktionen (ob nun aus 'ner Dll importiert oder nicht) in festen Zeitintervallen aufrufen, wenn ich dich richtig verstehe (?). Das kannst du doch z.B. über einen Timer lösen. Wie genau du die 10ms-Intervalle triffst, ist natürlich fraglich, aber so halbwegs haut das schon hin.


Anmelden zum Antworten