Forum: PC-Programmierung Verständnisfrage zu C#


von Martin M. (ats3788)


Lesenswert?

Hallo Ich bin ein C# Noop komme aus der Pascal C++ Welt
und schreibe ein C# Program für meine Bedürfnisse um.

Ich habe das ein Verständnis Problem

   public void Loop()
            {
                CPUMainboard_t Temperature;
                Temperature = GetSystemInfo();

                var command = new SendCommand((int)Command.kCore4Speed, 
f.ToString());
                 _cmdMessenger.SendCommand(command);

Der Author definiert eine Loop Schleife in main und das vertsähe ich 
nicht

>var command = new SendCommand((int)Command.kCore4Speed, f.ToString());

In C++ oder Pascal wird mit new ein Neues Object erstellt und auf dem 
Heap abgelegt ist das in C# nicht der Fall was macht das new hier, 
erstellt es nur eine neue Instanz ohne neuen Speicher anzufordern. Einen 
schönen Tag noch.

: Bearbeitet durch User
von Dirk K. (merciless)


Lesenswert?

Martin M. schrieb:
>>var command = new SendCommand((int)Command.kCore4Speed, f.ToString());
>
> In C++ oder Pascal wird mit new ein Neues Object erstellt und auf dem
> Heap abgelegt ist das in C# nicht der Fall was macht das new hier,
> erstellt es nur eine neue Instanz ohne neuen Speicher anzufordern. Einen
> schönen Tag noch.
1
command
 ist nach dieser Zeile ein Object vom Typ
1
SendCommand
Das
1
var
überlässt dem Compiler die Wahl, welchen Typ er hier
verwendet. Und ja, es wird Speicher alloziert.

merciless

von STK500-Besitzer (Gast)


Lesenswert?

Martin M. schrieb:
> Der Author definiert eine Loop Schleife in main und das vertsähe ich
> nicht

Bloß, weil das Ding "Loop" heißt, ist es noch lange keine.
Die Funktion wird irgendwo - vermutlich regelmäßig - aufgerufen.

Den Rest hat Dirk schon erklärt.

von Bastler (Gast)


Lesenswert?

Steht doch da, es wird eine neues Objekt erzeugt:
1
  var command = new SendCommand(...)

Und der Konstruktor hat eben zwei Parameter:
1
  var erster = (int)Command.kCore4Speed;
2
  var zweiter = f.ToString();
3
4
  var command = new SendCommand(erster, zweiter);

von Martin M. (ats3788)


Lesenswert?

Dirk K. schrieb:
> Und ja, es wird Speicher alloziert.

Danke wie kann man den freigeben in Pascal wirt mit  object.free
der Speicher wieder freigegeben.
I denke mal das macht C# automatisch als Moderne Sprache.
Die fertige Loop function sieht so aus und
funktioniert tadellos


1
            public void Loop()
2
            {
3
                //CPUMainboard.GetSystemInfo();
4
5
                CPUMainboard_t Temperature;
6
                Temperature = GetSystemInfo();
7
                
8
                var command1 = new SendCommand((int)Command.kCore1Temp, Temperature.TempCore1);
9
                 _cmdMessenger.SendCommand(command1);
10
11
                var command2 = new SendCommand((int)Command.kCore2Temp, Temperature.TempCore2);
12
                _cmdMessenger.SendCommand(command2);
13
14
                var command3 = new SendCommand((int)Command.kCore3Temp, Temperature.TempCore3);
15
                _cmdMessenger.SendCommand(command3);
16
17
                var command4 = new SendCommand((int)Command.kCore4Temp, Temperature.TempCore4);
18
                _cmdMessenger.SendCommand(command4);
19
20
                var command5 = new SendCommand((int)Command.kCore1Clock, Temperature.ClockCore1);
21
                _cmdMessenger.SendCommand(command5);
22
23
                var command6 = new SendCommand((int)Command.kCore2Clock, Temperature.ClockCore2);
24
                _cmdMessenger.SendCommand(command6);
25
26
                var command7 = new SendCommand((int)Command.kCore3Clock, Temperature.ClockCore3);
27
                _cmdMessenger.SendCommand(command7);
28
29
                var command8 = new SendCommand((int)Command.kCore4Clock, Temperature.ClockCore4);
30
                _cmdMessenger.SendCommand(command8);
31
32
                var command9 = new SendCommand((int)Command.kGPUClock, Temperature.ClockGPU);
33
                _cmdMessenger.SendCommand(command9);
34
35
                var command10 = new SendCommand((int)Command.kGPUTemp, Temperature.TempGPU);
36
                _cmdMessenger.SendCommand(command10);
37
38
39
                DateTime LocalDate = DateTime.Now;
40
                DateTime utcDate = DateTime.UtcNow;
41
42
43
                int Month = LocalDate.Month;
44
                int Year = LocalDate.Year;
45
                int Day = LocalDate.Day;
46
47
                int Hour = LocalDate.Hour;
48
                int Min = LocalDate.Minute;
49
                int Sec = LocalDate.Second;
50
51
                string date = String.Format("--> {0}:{1}:{2} {3}.{4}.{5} <--\r", Hour, Min, Sec, Day, Month, Year);
52
53
                Console.Write("Counter : ");
54
                Console.WriteLine(Counter++);
55
56
                var command11 = new SendCommand((int)Command.kGetTime, date);
57
                _cmdMessenger.SendCommand(command11);
58
                               
59
                Thread.Sleep(2500);
60
            }

Und ja Loop wurde in Main definiert


1
 
2
       static void Main(string[] args)
3
        {
4
     Console.WriteLine("Start the application...");
5
           
6
             var receive = new CPUMessenger_t { RunLoop = true};
7
            receive.Setup();
8
            while (receive.RunLoop) receive.Loop();
9
            receive.Exit();
10
11
        }
12
    }
13
}

Konnte sogar ein Admin Manifest hinzufügen wirklich einfach. Muss 
eigentlich um die C# Programme auszuführen auf allen Rechnern Net 
Installiert sein damit die Exe ausführbar ist.

von Bastler (Gast)


Lesenswert?

Martin M. schrieb:
> Die fertige Loop function sieht so aus

Oh man... Man, man, man...

So was tut doch weh...

von Dirk K. (merciless)


Lesenswert?

Martin M. schrieb:
> Dirk K. schrieb:
>> Und ja, es wird Speicher alloziert.
>
> Danke wie kann man den freigeben in Pascal wirt mit  object.free
> der Speicher wieder freigegeben.
Das macht der Garbage-Collector automatisch.

In deinem Fall würde ich die Commands in
einen Container packen und nicht alle 2,5
Sekunden neu erzeugen.

merciless

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.