C Win32 API Probleme mit Timer+Resourcen

Welche IDE nutzt ihr?


  • Umfrageteilnehmer
    17
  • Umfrage geschlossen .

badday

Commander
Registriert
Sep. 2007
Beiträge
3.023
Moin zusammen,

ich schreibe derzeit an einem Programm in C (Win32-API)

Als IDE nutze ich Code::Blocks, als Compiler nutze ich Borland.

Was ich jetzt brauche ist ein Plugin etc., um Resourcen-Scripte zu erstellen.

Oder muss ich da auf externe Programme zurückgreifen? (ich benutze soetwas zum ersten Mal; bitte um Nachsicht ;-) )

Wenn ich schon mal ein Thema hab, gleich noch ne Frage:

Kann man den Timer anweisen z. B. nur 10 mal ne Nachricht zu schicken, oder muss man das via Schleifen/2.Timer lösen?

Wenn ja: wie?

if (wParam==IDT_TIMER2)

{ lResult= SendMessage(

(HWND) hwndpro,

(UINT) TBM_SETPOS,

(WPARAM) TRUE,

(LPARAM)1


);
a++;};
if (a==10)
KillTimer(hwnd, IDT_TIMER2);

läuft nicht, er hört dann nicht mehr auf, die Progressbar zu füllen, wenn sie voll ist, fängt er wieder von vorn an.




Vielen Dank!

MfG

badday
 
Zuletzt bearbeitet:
AW: Code::Blocks: Resourcen-Script?

Versuch doch mal den Timer in die If-Anweisung a==10 zu setzen.
Oder eine Schleife mit do while a<10, dann sollte es gehen.
 
AW: Code::Blocks: Resourcen-Script?

a=0;

case WM_TIMER:
do
{


a++;
if (wParam==IDT_TIMER2)
{
lResult= SendMessage(

(HWND) hwndpro,

(UINT) TBM_SETPOS,

(WPARAM) TRUE,

(LPARAM)1

);


}


}
while(a<10);

Führt wieder zur Entlosschleife.

Ggf. bitte genauer sagen, was du meinst.

MfG

badday
 
Zuletzt bearbeitet:
AW: Code::Blocks: Resourcen-Script?

Beschreib doch mal wofür du den Timer benötigst. Mir ist noch nicht ganz klar was du erreichen willst.
 
AW: Code::Blocks: Resourcen-Script?

Der Timer soll einfach eine Porgressbar füllen, und dass schrittweise, sprich jede Sekunde um einen Schritt.
Das ist nat. ein rein optischer Effekt, soll aber in einer späteren Version des Programms dann "richtig" benutzt werden.

MfG

badday
 
AW: Code::Blocks: Resourcen-Script?

Laut msdn solltest du so einen Timer hinbekommen mit einem 2 Sekunden Interval.

PHP:
void CMainFrame::OnStartTimer()
{
   m_nTimer = SetTimer(1, 2000, 0);
}

void CMainFrame::OnStopTimer()
{
   KillTimer(m_nTimer);  
}

void CMainFrame::OnTimer(UINT nIDEvent)
{
   MessageBeep(0xFFFFFFFF);   // Beep

   // Call base class handler.
   CMDIFrameWnd::OnTimer(nIDEvent);
}

Wenn du das noch in eine Schleife packst sollte es doch klappen.
 
AW: Code::Blocks: Resourcen-Script?

Sorry, aber ich weiß nicht was ich mit dem code anfangen soll.

Ich programmiere in C in der Win32-API.

MfG

badday
 
AW: Code::Blocks: Resourcen-Script?

PHP:
case WM_CREATE:
{
    SetTimer(hWnd, Timer1, 1000, NULL);
    return 0;
}

while (a < 10) {
a++
case WM_TIMER:
{
    switch(wParam)
    {
        case Timer1:
        {
	//deine Anweisungen
            }
        return 0;
        }
    }
    return 0;
}
}

Ich kann das leider nicht testen, aber so sollte es doch gehen.
 
AW: Code::Blocks: Resourcen-Script?

SetTimer(hwnd,IDT_TIMER2, 1000, NULL);
return 0;

...
...
...

while (a < 10) {
a++;
case WM_TIMER:
{
switch(wParam)
{
case IDT_TIMER2:

{

lResult= SendMessage(

(HWND) hwndpro,

(UINT) TBM_SETPOS,

(WPARAM) TRUE,

(LPARAM)1


);

}
return 0;
}

Führt leider wieder zu einer Endlosschleife.

MfG

badday
 
also um es prägnant auszudrücken: Fang nicht mit MFC & co an, das lehrt dich absolut nichts und verwirrt nur. Lerne zuerst elementares (!) C. Danach kannst du dich (langsam!) an C++ herantasten und erst danach kannst du mit Win32 - Programmierung anfangen - die MFC ist eine der schwierigsten APIs. Ich bin nun wirklich kein Anfänger mehr aber ich verstehe ca. 10% von deinem Code ... wenn du wirklich ein Anfänger bist dann ist das ganz sicher kein erfolgsversprechender Weg
 
Win C API Timer Funktion Beispiel:

-----------------------------------------
#define TIMER_SEC 1
#define TIMER_MIN 2

SetTimer(hwnd, TIMER_SEC,1000,0);
SetTimer(hwnd, TIMER_MIN,60000,0);

int nCounter = 0;

... Messageloop---

case WM_TIMER:
switch (wParam)
{
case TIMER_SEC:
// Ausführung pro Sekunde
// do something
nCounter++;
if(nCounter == 10)
{
nCounter = 0;
// do something
}
break;
case TIMER_MIN:
// Ausführung pro Minute
break;
}
return 0;

.... Messageloop....

KillTimer(...
--------------------------------------------------
Was passiert hier, der TIMER_SEC wird jede Sekunde (in der messageloop) 'angesprungen'.
Hier kann denn jede beliebige Anweisung stehen, z.B. Balken auf Position nCounter setzten.
Falls Der Wert 10 erreicht wird setzte den Balken wieder auf Position 0 und wieder von vorne.
Die Variable nCounter muss ausserhalb der messageloop deklariert werden (scope).
Der 'Denkfehler' liegt hier in der Schleife.
Bei WINAPI wird beim Timerereignis eben WM_TIMER in der Messageloop angelaufen.

In einer Schleife würde man normalerweise mit sleep() arbeiten, allerdings würde das während der Zeitdauer die messageloop blockieren, Windows friert dann gewissermaßen solange ein.
 
Moin,

@BlackMan: Danke für die Erklärung, aber der Grundsatz ist mir schon klar.

@tha_specializt: Ja, ich würde auch niemandem raten, damit anzufangen. Ich selbst habe ebenfalls erst mit C, dann mit C++ und mich schließlich mit beiden ausführlich auseinandergesetzt. Jetzt bin ich soweit, dass ich die Win32-API begreife und arbeite mich mit Petzold, wem sonst, durch.


--------

Habe das Problem mittlererweile gelöst, wen es interessiert:
SetTimer(hwnd,IDT_TIMER2, 1000, NULL);
SetTimer(hwnd,IDT_TIMER1, 11000, NULL);
return 0;


...

case WM_TIMER:
switch (wParam)
{
case IDT_TIMER2:


lResult= SendMessage(

(HWND) hwndpro,

(UINT) TBM_SETPOS,

(WPARAM) TRUE,

(LPARAM)1


);


break;

case IDT_TIMER1:

KillTimer(hwnd, IDT_TIMER2);



break;

}
return 0;
KillTimer(hwnd, IDT_TIMER1);





}


Ist zwar nicht sonderloch elegant, aber zweckmäßig, also was solls.

Ja, der Thread hat sich ja dahingehend entwickelt, dass mir alle dabei geholfen haben, das mit der Schleife in der Griff zu bekommen, danke nochmal.

Aber ich hatte auch noch einen 2. Teil, den ich hier gerne nochmal wiederhole:


Als IDE nutze ich Code::Blocks, als Compiler nutze ich Borland.

Was ich jetzt brauche ist ein Plugin etc., um Resourcen-Scripte zu erstellen.

Oder muss ich da auf externe Programme zurückgreifen? (ich benutze soetwas zum ersten Mal; bitte um Nachsicht ;-) )


MfG und vielen Dank,

badday
 
Zuletzt bearbeitet:
Vermutlich suchst du so etwas wie einen Resourcen Editor.
Google hilf, http://www.resedit.net/
Sieht auf den ersten Blick brauchbar aus. Ansonsten selbst mal danach suchen.

PS.: habe mir das Teil s.o. mal kurz angesehen, es sieht richtig gut aus.
Allerdings benötigt es eine 'sal.h'. Die ist im Windows SDK nicht vorhanden, eine Dateisuche lieferte mir (64BIT Sys) C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include
Ergo wird dafür irgendetwas von Visual Studio 2008 benötigt. Die Frage ist hier was soll das, VC9 hat doch einen integrierten Resourceneditor. Anrwort: jein, die Vollversion selbstverständlich. In der 'kostenlosen' Version https://www.computerbase.de/downloads/systemtools/entwicklung/visual-studio-2015/
fehlt dieser eben in VC. hier ist nur ein Res. Editor für das .Net Zeug enthalten.
Bei der kostenlosen Variante von VC fehlen u.a. eben die MFC und ein Editor für 'native' Windowsresourcen.
Falls du nicht mit VC9 arbeiten willst, wirst du dir das für resedit warscheinlich installieren müssen, ob du das oder deine vorhandene Umgebung benutzt....
 
Moin,

ja das Programm macht nen guten Eindruck. Hab auch selbst schon im Inet gesucht und bon darauf gestoßen:
MicroTools4U-Source Editor

Was ich aber eigentlich suche wäre ein Plugin für Code::Blocks. Wäre natürlich super, wenn es sowas gäbe.


MfG

badday
 
Es ist natürlich auch so möglich, aber ich dachte an ein code::blocks generated resource scpript.

MfG

badday
 
badday schrieb:
Es ist natürlich auch so möglich, aber ich dachte an ein code::blocks generated resource scpript.

MfG

badday

Vom Resourcen Editor erzeugte *.h und *.rc Dateien mit ins Projekt aufnehmen. Den Editor separat oder per Script starten. Wo liegt hier das Problem.

Falls du eine IDE möchtest wo alles 'out of the box' für WIN API C (ohne C++) integriert ist, wirst du mit einer anderen als CODE:BLOCKS vielleicht besser zurechtkommen.

Siehe oben Umfrage: Pelles C
http://www.christian-heffner.de/index.php?page=start&lang=de
http://www.christian-heffner.de/index.php?page=overview&lang=de

Da hast du alles was du für die C WINAPI Programmierung benötigst unter einem Hut, ggf. noch das SDK Plugin zusätzlich.
 
Zuletzt bearbeitet:
Moin,

ja das stimmt mit der IDE. Aber ich mag Code::Blocks mittlererweile so gern (warum auch immer), dass ich das wohl in Kauf nehme.
Also Danke BlackMan für die ausgesprochen kompetente Hilfe!

MfG

badday
 
Zurück
Oben