Autor Beitrag
ssb-blume
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Di 28.07.15 09:38 
Hallo,

Ich habe ein merkwürdiges Verhalten eines Timers:

Der Timer wird in einer Procedur mit einem Parameter erlaubt/verboten.
Wird diese Procedur über einen Button-Click aufgerufen, funktioniert der Timer.

Wird aber über die Midi-Schnittstelle ein On/Off (9n note off, 9n note on) empfangen
und damit diese Procedur aufgerufen, wird zwar der Timer angesprochen, aber er läuft nicht.
Auch ein Break an dieser Stelle zeigt, obwohl ein enabled gesetzt wurde, dieses
nicht den Timer einschaltet!

Ich bin ratlos. Habe auch in dieser Procedur den Timer selbst erzeugt, kein Unterschied.
Kann es sein, daß die Midischnittstelle (über BASS.DLL) -Callback- der Timer nicht angesprochen wird?

Danke für eine Erklärung und evtl. eine Möglichkeit, wie ich es machen muß.

Hansi

_________________
Brain: an apparatus with which we think we think.
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Di 28.07.15 09:49 
Könntest du evtl. den relevanten Code (wo was deklariert ist und wo/wie der Timer gestartet wird) hier posten.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 28.07.15 09:56 
Wenn ich das richtig im Kopf habe, arbeitet der TTimer mit der WM_TIMER Message von Windows. Das ist ein Low-Priority-Message. Das heißt, das wird nur ausgeführt, solange die Anwendung nichts besseres zu tun hat. Nu weiß ich nicht, wie die MIDI-Schnittstelle arbeitet, könnte mir aber vorstellen, dass da noch was anderes abläuft.

Ich verwende eigentlich nie mehr den TTimer. Ich schreib mir da lieber einen Thread, dem ich im Bedarfsfall die Arbeit übergeben kann. Eine einfache Threadschleife
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
while not terminated do
begin
  MachArbeit;
  Sleep(1000);
end;

ist ja schon ein simpler Timer, wenn man so will.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Di 28.07.15 10:41 
Hier etwas Code:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
        public void MyMidiInProc(IntPtr handle, MIDIMessage msg, IntPtr instance,
            IntPtr param1, IntPtr param2)
        { // hier werde die bytes empfangen und es entsteht dann:
                    v = Convert.ToInt32(b3, 16);      // velocity, volume
                    mode = Convert.ToByte(b1, 16);    // 8..F
                    key = Convert.ToByte(b2, 16);     // key    0..63
                    channel = Convert.ToByte(b0, 16); // kanal  0..15
                    pressed = (b1 == "9") & (b3 != "00");
                    vel = (float)Convert.ToDouble(v);
    ....
             if ((channel == 4) & (key == 17))
             {
                 starteTimer(pressed)
                 // dies wird aufgerufen, der Timer erzeugt, jedoch nicht gestartet!
             } 
        }

        private void starteTimer(bool on)
        {
            timer3 = new Timer();
      if (on)
            {
                int f = Convert.ToInt32(vibF.Value);
                timer3.Interval = 500;
                timer3.Tick += timer3_Tick;
                timer3.Enabled = true;       
                timer3.Start();
            } else
            {
                timer3.Stop();
                timer3.Enabled = false;
                timer3.Dispose();
            }
        }
       
        // über einen butten wird zu Testzwecken diese Procedur aufgerufen, geht!!


:baumina: kannst Du damit was anfangen? Ich habe Unwesentliches weggelassen.

hansi

_________________
Brain: an apparatus with which we think we think.
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Di 28.07.15 10:44 
Ups, irgendwie hatte ich mit Delphicode gerechnet, sry ich passe.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 28.07.15 10:47 
Dem schließe ich mich an.... :lol:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 28.07.15 10:52 
Kann es sein, dass du an der Stelle in einem Thread bist?
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Di 28.07.15 11:01 
Hallo jaenicke,

ja, denn es ist ja ein Callback!
Trotzdem sind noch viele weitere Funktionen, die abgearbeitet werden, in diesem Kontext ok.
Nur der Timer wird ja erzeugt, ist auch vorhanden, aber macht nix. Die Kontrolle im Break,
ergab, das der Timer zwar existierte, der aber das Enable nicht entgegen nimmt.

Hansi

_________________
Brain: an apparatus with which we think we think.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 28.07.15 11:08 
Der Timer funktioniert bei C# auch nur im Hauptthread soweit ich weiß.

// EDIT:
Scheint doch zu gehen. Aber vielleicht wird der Thread z.B. wieder beendet und es geht deshalb nicht.

Hier gibt es ein Beispiel explizit für Threads:
msdn.microsoft.com/d...5easy(v=VS.120).aspx
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Di 28.07.15 15:49 
Danke jaenicke, werd es mal probieren...

Hansi

_________________
Brain: an apparatus with which we think we think.
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Di 28.07.15 17:23 
Danke nochmals. Es geht jetzt genau so, wie ich es wollte.
Das Beispiel konnte ich sogar noch etwas verkleinern.

Hansi

_________________
Brain: an apparatus with which we think we think.