# Miniprogramm mit 50% CPU-Auslastung?



## RoninSL (14. Juli 2017)

Ich hab erst vor kurzem angefangen mich ein bisschen mit C++ auseinanderzusetzen.
Jetzt habe ich mir ein wirklich kleines Programm geschrieben, das aber eine CPU-Auslastung von 50 - 70% erzeugt, was viel zu viel ist (wenn ich überlege, dass ich High-End-Games spielen kann und die gerade mal 15-20% brauchen?).

Ich weiß aber auch nicht wie ich das hinsichtlich der Performance hinbekomme, deswegen habe ich hier mal einen Quellcode und hoffe, dass ihr mir einen Tipp geben könnt, wo mein Problem liegt und wie ich das in den Griff bekomme:


```
#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include <string>
#include <Windows.h>
#include <thread>

class Funktionen {
public:
    Funktionen();
    void Funktionen::SimMausklicks();
    ~Funktionen();
};

Funktionen::Funktionen()
{
}

void Funktionen::SimMausklicks() {

    while (true) {

        // Simuliere langen Mausklick mit Druck auf Linke Alt-Taste
        if (GetAsyncKeyState(18)) {
            mouse_event(MOUSEEVENTF_LEFTDOWN, NULL, NULL, NULL, NULL);
            Sleep(60000);
            mouse_event(MOUSEEVENTF_LEFTUP, NULL, NULL, NULL, NULL);
        }
    }

}

Funktionen::~Funktionen()
{
}

int main()
{

    Funktionen Funktionen;

    std::thread thread1(&Funktionen::SimMausklicks, &Funktionen);
    thread1.detach();

    bool run = true;

    while (run)
    {
        // Programm schließen mit Q
        if (GetAsyncKeyState(81))
        {
            run = false;
        }

    }

    return 0;

}
```

Im Moment soll da also nur eine Minute die Maus geklickt werden, es sollte noch eine zweite Funktion rein (die musste ich erstmal löschen weil mein Programm dann komplett abstürzt) deswegen möchte ich auch einen thread damit dann beide funktionen zeitgleich laufen können.
(Und ja: Ich möchte es benutzen um in Minecraft zu bescheißen - man muss da ewig lange mit der Maus klicken. Shame on me! Mir fiel einfach sonst kein sinnvoller Zweck für ein Programm ein um zu lernen und n Taschenrechner fand ich langweilig *g*)

Aber es kann doch nicht richtig sein, dass so ein Mini-Programm so eine hohe CPU-Auslastung hat? Was genau mach ich denn da falsch?


----------



## Bratkartoffel (14. Juli 2017)

Hi,

deine beiden "while(true)" laufen ununterbrochen durch, ohne Pause und Ablass. Du wirst wohl 4 Kerne haben, macht also zwei Schleifen = 50% Auslastung.
Bau in die Schleifen auch noch ein Sleep ein wenn dein if nicht trifft, damit gibt dein Programm die CPU wieder für eine gewisse Zeit frei.

Jetzt prüfen deine Schleife so oft sie können, ob eine Taste gedrückt wurde. Und das somit viele Tausende Male pro Sekunde. Durch das sleep "bremst" du das halt auf ein paar Mal pro Sekunde, was auch auf alle Fälle ausreichend sein dürfte.

Grüsse,
BK


----------



## sheel (14. Juli 2017)

edit: Und zu langsam...

Hi

Programme werden in der Regel so schnell wie möglich ausgeführt. Im "while (run)" - Teil gibt es nichts, worauf gewartet werden muss (Usereingaben, Netzwerkdaten, andere Threads, usw.usw.), deshalb nimmt sich das Programm so viel Prozessorleistung wie es bekommen kann (dH. wie viel das Betriebssystem zuweist. Zumindest das Betriebssystem selber braucht für Verwaltungssachen auch immer wieder ein paar Mikrosekunden)

Dein Prozessor hat mehr als einen "Kern", daher ist es nicht 100% (ein einzelner Thread, wie hier der main-Thread, kann nicht auf mehreren Kernen gleichzeitig laufen. Das ist einer der Hauptgründe, Threads zu verwenden; mehrere Threads können eben mehrere Kerne auslasten (können, nicht müssen)).

Warum das andere Programme besser können? Was du willst ist im wesentlichen, auf einen Tastendruck zu warten und erst dann was zu tun. Dafür ist es auf den üblichen Betriebssystemen _nicht_ nötig, dauerhaft den Tastenzustand zu prüfen. Stattdessen gibt es Funktionen, die beim Aufruf prozessorschonend auf "Ereignisse" vom Betriebssystem warten 8es gibt eine Reihen von verschiedenen, Tastendrücke sind eins davon). In Windows-Konsolenprogrammen ist es leider nicht ganz ideal gelöst, aber mit WH_CALLWNDPROC, SetWindowHookEx, GetConsoleWindow sollte was machbar sein (für die abgefragte Fenster-ID der Konsole einen Hook, also eine vom OS aufgerufene Funktion, vom Typ WH_CALLWNDPROC registrieren. In der Funktion, wo nicht nur Tastenevents ankommen, danach filtern, und dann was tun. Geht aber nicht so direkt im Main, sondern wird Kommunikation zwischen deinen Threads nötig machen, und da kommen dann Mutexe usw. ins Spiel...)

Einfach Sleeps einbauen wird die Prozessorlast verringern, aber dafür gibts auch ein Risiko dass ein sehr schneller Tastendruck (Beginn und Ende während einem Sleep) nicht vom Programm erkannt wird.


----------



## cwriter (14. Juli 2017)

Hi

Bratkartoffel hat eigentlich schon vieles gesagt. Dennoch ein paar Anmerkungen:


RoninSL hat gesagt.:


> wenn ich überlege, dass ich High-End-Games spielen kann und die gerade mal 15-20% brauchen?).


Spiele machen i.d.R. einfach eine 100%-Auslastung auf der GPU (ausser mit Frameratelocks wie V-sync. Oder schlechter Programmierung. Das erklärt auch, warum alte Spiele wie Quake heutzutage jenseits der 1000fps laufen).


RoninSL hat gesagt.:


> Ich weiß aber auch nicht wie ich das hinsichtlich der Performance hinbekomme, deswegen habe ich hier mal einen Quellcode und hoffe, dass ihr mir einen Tipp geben könnt, wo mein Problem liegt und wie ich das in den Griff bekomme:


Die Performance deines Programms ist ziemlich perfekt: Du hast kaum Downtimes, nur sehr wenige Tastendrücke werden verzögert erkannt. Dummerweise kann der Computer durch die Auslastung gleichzeitig nix anderes mehr machen.
Bei GetAsyncKeyState(), welches den Status (und nicht den Druck) liest, kommt es auf die Pollrate nicht wirklich an, daher kann man durchaus das von BK vorgeschlagene sleep_for nutzen. Allerdings: std::this_thread::yield() ist für kleinere Latenzen besser geeignet (sleep_for nutzt intern auch yield, ist aber klobiger).



RoninSL hat gesagt.:


> deswegen möchte ich auch einen thread damit dann beide funktionen zeitgleich laufen können


Das ist nicht nötig. Threads sind overhead. Alleine die Context Switches sind wahrscheinlich teurer als deine Funktionen.
Die eine 1 Mikrosekunde (wenn überhaupt) zwischen zwei solchen Calls ist vernachlässigbar.



RoninSL hat gesagt.:


> Und ja: Ich möchte es benutzen um in Minecraft zu bescheißen - man muss da ewig lange mit der Maus klicken. Shame on me! Mir fiel einfach sonst kein sinnvoller Zweck für ein Programm ein um zu lernen und n Taschenrechner fand ich langweilig *g*


Für diesen speziellen Task würde ich aber einen Schalter (on-off) statt eines Triggers (on->sleep->off) verwenden.
sleep(60000) ist auch nicht optimal, da sehr ungenau. Hier wären wirklich sleep_for() oder sleep_until() besser.



RoninSL hat gesagt.:


> Aber es kann doch nicht richtig sein, dass so ein Mini-Programm so eine hohe CPU-Auslastung hat? Was genau mach ich denn da falsch?


Als Faustregel: Sobald ein Programm Endlosloops hat, lastet es einen Kern voll aus, sofern der Loop nicht gebremst wird (durch sleeps oder andere Hardwarezugriffe (Festplatte, Netzwerk, etc.))

Oder anders ausgedrückt: Die CPU-Auslastung ist proportional zu der Anzahl der ausgeführten Instruktionen. Ohne Loops kriegst du es heutzutage nur selten hin, so viele Instruktionen auszuführen. (Bei 10^6 Instruktionen pro Sekunde (moderne CPUs sind schneller) und einer Durchschnittlichen Instruktionsgrösse von 4 Bytes wären das immerhin 4MB an .exe oder .dll, das du haben müsstest, um 1s lang eine 100% Auslastung eines Kerns zu erreichen).


Gruss
cwriter


----------



## RoninSL (14. Juli 2017)

So einfach also... Vielen Dank 
Ich hab nun in jede while-Schleife ans Ende ein "Sleep(100)" gesetzt. Die Auslastung ist damit direkt auf 1% gesunken.

Gibt es da eigentlich noch andere Möglichkeiten als eine while-Schleife? Also ich kenne das von Javascript, da gibt es Events, so kann man z.B regeln dass eine Funktion nur dann aufgerufen wird wenn XY passiert (also ohne ständige while-Schleife)?


----------



## cwriter (14. Juli 2017)

sheel hat gesagt.:


> Stattdessen gibt es Funktionen, die beim Aufruf prozessorschonend auf "Ereignisse" vom Betriebssystem warten 8es gibt eine Reihen von verschiedenen, Tastendrücke sind eins davon).





RoninSL hat gesagt.:


> Gibt es da eigentlich noch andere Möglichkeiten als eine while-Schleife? Also ich kenne das von Javascript, da gibt es Events, so kann man z.B regeln dass eine Funktion nur dann aufgerufen wird wenn XY passiert (also ohne ständige while-Schleife)?


Für Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx



RoninSL hat gesagt.:


> Ich hab nun in jede while-Schleife ans Ende ein "Sleep(100)" gesetzt.


Microsoft ist da recht nett und behält alte Funktionen. Allerdings ist Sleep() keine Standardfunktion und entsprechend gibt es die auch nicht auf anderen Systemen (oder sie sind anders implementiert, bspw. warten sie dann Sekunden und nicht Millisekunden). Geht natürlich auch so, allerdings sollte man sich früh angewöhnen, wann immer möglich den Standard zu verwenden.

Gruss
cwriter


----------



## RoninSL (14. Juli 2017)

Super, vielen Dank für eure ausführlichen und hilfreichen Antworten.  
Hab leider erst jetzt alle lesen können.



cwriter hat gesagt.:


> Für Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx



Das werde ich definitiv mal probieren.



cwriter hat gesagt.:


> Microsoft ist da recht nett und behält alte Funktionen. Allerdings ist Sleep() keine Standardfunktion und entsprechend gibt es die auch nicht auf anderen Systemen (oder sie sind anders implementiert, bspw. warten sie dann Sekunden und nicht Millisekunden). Geht natürlich auch so, allerdings sollte man sich früh angewöhnen, wann immer möglich den Standard zu verwenden.



Ja, das habe ich schon öfter gelesen. Ich werde mich schnellstmöglich nach besseren alternativen umsehen. 



cwriter hat gesagt.:


> Das ist nicht nötig. Threads sind overhead. Alleine die Context Switches sind wahrscheinlich teurer als deine Funktionen.
> Die eine 1 Mikrosekunde (wenn überhaupt) zwischen zwei solchen Calls ist vernachlässigbar.



Das verstehe ich nicht so ganz. Wenn ich nun keine threads verwende dann wird doch jede Funktion nacheinander ausgeführt. Wenn ich jetzt also z.B diesen 60-Sekunden Mausklick habe, dann wird doch die nächste Funktion erst ausgeführt wenn der Mausklick (bzw. die Funktion) beendet wurde? Also würden die nicht "gleichzeitig" laufen können oder versteh ich das falsch?


----------



## cwriter (14. Juli 2017)

RoninSL hat gesagt.:


> Das verstehe ich nicht so ganz. Wenn ich nun keine threads verwende dann wird doch jede Funktion nacheinander ausgeführt.


Das stimmt. Was lässt dich denken, dass Threads parallel sind?
Threads gibt es auch auf 1-Kern-Prozessoren. Dort laufen die einzelnen Programme nacheinander.
Selbst auf Mehrkernprozessoren ist nicht garantiert, dass Threads auf unterschiedlichen Cores laufen müssen (tatsächlich gibt es Probleme mit Cache-Locality, wenn Threading genutzt wird). In aller Regel werden sie durchaus parallel ausgeführt, aber es gibt im C++ Standard keine Garantie dafür.



RoninSL hat gesagt.:


> Wenn ich jetzt also z.B diesen 60-Sekunden Mausklick habe, dann wird doch die nächste Funktion erst ausgeführt wenn der Mausklick (bzw. die Funktion) beendet wurde? Also würden die nicht "gleichzeitig" laufen können oder versteh ich das falsch?


Ok, gehen wir es durch:
Was passiert beim Sleep()?
-> Das Betriebssystem wird den Thread nicht mehr aufrufen (oder zumindest weniger oft), bis die Zeit um ist. Der Thread liegt also quasi brach.
Eine Alternative wäre sowas:

```
void Funktionen::SimMausklicks() {

    //kleine FSM
    enum {
        Released,
        Holding
    } state = Released;

    auto start = std::chrono::system_clock::now();


    while (true) {

        // Simuliere langen Mausklick mit Druck auf Linke Alt-Taste
        if(state == Released)
        {
            if (GetAsyncKeyState(18)) {
                mouse_event(MOUSEEVENTF_LEFTDOWN, NULL, NULL, NULL, NULL);
                start = std::chrono::system_clock::now(); //EDIT: Das hier braucht's natürlich auch...
                state = Holding;
            }
        }
        else if(state == Holding)
        {
            if(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now() - start).count() >= 60) //Wenn 60s um: Release und state switch
            {
                mouse_event(MOUSEEVENTF_LEFTUP, NULL, NULL, NULL, NULL);
                state = Released;
            }
            //Sonst nicht

        }
        andererTask();
        std::this_thread::yield(); //Oder std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
   
}
```
Also ungetestet, aber müsste eigentlich so etwa funktionieren.
Im Prinzip überprüft es immer wieder die Zeit, sodass es nicht blockiert. Dann kannst du auch in andererTask() etwas anderes machen. Im selben Thread.

In dem Sinne läuft es genug "gleichzeitig".

Gruss
cwriter


----------



## RoninSL (14. Juli 2017)

cwriter hat gesagt.:


> Was lässt dich denken, dass Threads parallel sind?



Hatte bei google gesucht wie ich zwei Funktionen gleichzeitig laufen lassen kann. Als Antwort gab es immer nur den Verweis auf Threads. Deswegen hatte ich angenommen, dass wäre dann so.



cwriter hat gesagt.:


> Eine Alternative wäre sowas:



Das werde ich heute Abend mal bei mir testen. Danke Dir für das Beispiel.


----------



## cwriter (14. Juli 2017)

RoninSL hat gesagt.:


> Hatte bei google gesucht wie ich zwei Funktionen gleichzeitig laufen lassen kann. Als Antwort gab es immer nur den Verweis auf Threads. Deswegen hatte ich angenommen, dass wäre dann so.


Ok, vielleicht muss ich da etwas genauer werden:
Sagen wir, wir haben 2 Threads, A und B, welche Einzelschritte A.1, A.2, ... bzw. B.1, B.2, ... haben.

Dann erlaubt Threading sowas:
A.1
A.2
B.1
A.3
B.2
B.3
B.4
A.4

Grundsätzlich: Die Reihenfolge ist nicht vorgeschrieben. Ob das nun auf einem oder auf mehreren Kernen läuft, ist egal:
Core 0:
A.1
A.2
B.1
A.3
B.2
B.3
B.4
A.4

Oder mit 2 Kernen:
(A.n und B.n laufen jeweils gleichzeitig)

```
Core 0:     Core 1:
A.1          
A.2
                 B.1
A.3           
                 B.2
                 B.3
                 B.4
A.4
```

Oder auch so:


```
Core 0:     Core 1:
A.1         
A.2
B.1
A.3           
                 B.2
                 B.3
                 B.4
                 A.4
```

Es gibt keine Garantie, dass irgendeine Reihenfolge eingehalten wird.
Theoretisch kann auch A komplett, dann B komplett durchlaufen.
Nun _scheint_ es parallel, auch auf einem Kern. Einfach daher, dass es oft zwischen den Tasks hin- und her-wechselt. Es läuft also "gleichzeitig".
Das heisst aber nicht, dass 2 Codeabschnitte gleichzeitig ausgeführt werden müssen, eigentlich geht das ja gar nicht.

```
std::atomic<int> contest = 1;

//Thread 1:
contest = 1;

//Thread 2:
contest = -1;
```
std::atomic garantiert, dass Schreibvorgänge abgeschlossen werden, d.h. dass es keinen Zustand gibt, wo contest nicht 1 und nicht -1 ist.
Aber gleichzeitig schreiben geht ja nicht, die Bits wären ja immer verschieden. Parallelismus kann hier nicht existieren, daher machen Threads wenig Sinn in diesem Beispiel.

TL;DR:
Threads können sehr cool sein. Aber wenn sie vermeidbar sind, sollte man sie vermeiden. Unter anderem ist die Korrektheit von Parallelen Programmen noch immer eines der grössten Forschungsgebiete und man hat noch keine echte Antwort für die Probleme.

Gruss
cwriter


----------



## sheel (14. Juli 2017)

> Deswegen hatte ich angenommen, dass wäre dann so.



Sagen wir mal, es ist eine Voraussetzung. Eine von vielen.

Und jedenfalls ist es keine Garantie. Auch wenn alle Voraussetzungen erfüllt sind kann das OS entscheiden, deine Threads lieber auf einem Kern zu haben, und die anderen für andere Programme zu verwenden. In dem Fall wechseln sich deine Threads auf ihrem einen Kern schnell ab, alle paar Millisekunden ein anderer.


----------



## jkallup (14. Juli 2017)

ja das ist mal wieder typisch Anfänger dann C++ und auch noch Fensterprogramme.
dieses Sleep ist von Assbachuraltzeiten.
Es bringt das ganze System in schwanken.
Also weg damit.
Thread's sind ok - Aber als Anfänger??

Lieber mit Consolen Programme starten und lernen.
Bildpunktprogramme werden später erlernt. Dieses buntiklicki das is echt nicht lehrreich

Ich weiss, ich stelle auch hin und wieder Fragen über C++, aber das sind dann schwerere Brocken.
Und fürs lernen einer Programmiersprache ist ein Computer mit 4 Kernen viel zu viel overkill.
Da reicht nen Intel duo2 mit 4 GB Ram und eine 200 GB Festplatte.
Dort machst Dir dann Linux Deiner Wahl drauf und gut is.
Linux ist dann nicht so anfällig auf Fehler.
Was hab ich für Stunden gesessen, und hab das Fensterprogramm einrichten müssen, da es
freezed modus gestartet hat,und das bei nur 2 schleifen.

Aber naja, ich will nicht vormundschaften, soll jeder machen was er will ...


----------



## sheel (14. Juli 2017)

Sorry, aber von diesem Beitrag kann ich praktisch nichts unkommentiert stehen lassen.



jkallup hat gesagt.:


> ja das ist mal wieder typisch Anfänger dann C++


Gibt es irgendein Problem...? 
Wir alle waren mal Anfänger.



jkallup hat gesagt.:


> und auch noch Fensterprogramme.


Seh nichts davon



jkallup hat gesagt.:


> dieses Sleep ... bringt das ganze System in schwanken.


Details dazu würden mich interessieren... nur weil der C++-Standard ca. 30 Jahre später auch so eine Funktion hat ist die alte nicht gleich kaputt.



jkallup hat gesagt.:


> Bildpunktprogramme werden später erlernt


...oder besser gar nicht. Wer alles aus einzelnen Pixeln zusammensetzt... (   )



jkallup hat gesagt.:


> Und fürs lernen einer Programmiersprache ist ein Computer mit 4 Kernen viel zu viel overkill.


Wer weiß, vielleicht hat der Fragesteller den Computer ja für mehr Anwendungen gekauft, nicht nur C++-Anfängerprogramme 
... zB. einen Computer, der mit immer aufgeblähteren "modernen" Windows-Versionen, VS, usw.usw., umgehen kann...



jkallup hat gesagt.:


> Linux ist dann nicht so anfällig auf Fehler.


Das würde mich auch interessieren ... (ich mag und verwende Linux, aber Fehler haben alle mir bekannten OS mehr als genug)



jkallup hat gesagt.:


> Was hab ich für Stunden gesessen, und hab das Fensterprogramm einrichten müssen, da es
> freezed modus gestartet hat,und das bei nur 2 schleifen.


Äh was? ... Distributionen, der gleich nach dem Installieren schon unbrauchbar sind, gibts zwar, aber da ist man dann wohl selbst schuld wenn man das verwendet...


----------



## jkallup (14. Juli 2017)

naja, hast ja recht.
Ich mag es nur nicht, wenn bei mir Leute klingeln, die Programmieren lernen wollen
aber gleichzeitig die ersten Kapitel überspringen und dann Fragen stellen, wie wird
ein String zeichen an Position sliced ...
Oder was auch der Fehler von so manchen HS war, C++ Builder oder Java-Builder
oder Delphi für die Lehre zu verwenden.
Da man bei diesen Produkten, eigentlich nur noch klickiklaki machen brauchte um
ein Programm zu erstellen.
Erstens waren diese Produkte teuer und ich hab immer so eine Ablehnung gehabt,
wenn ständig die gesamten VCL Libs hinzugefügt wuirden an das Executable File.
Ok, man konnte auch BPL Dateien schreiben, die ein sharing ähnlich der DLL's unter
dem Fensterprogramm darstellten.
Aber man musste dann auch wiederrum sicherstellen das Patches, usw. mitgeliefert
wurden. Nicht zu vergessen das einschleichende Ressourcen Burning des jungen
Programmierers.
Nicht umsonst gab es da das VisualC++, das speziell an das Fensterprogramm aus-
gerichtet war aber auch damit sehr sehr schwer zu Portieren war auf andere
ISO Programmen.


----------



## RoninSL (15. Juli 2017)

jkallup hat gesagt.:


> Lieber mit Consolen Programme starten und lernen.



Ist doch ein Konsolen-Programm. Das einzig einfachere als dieses Programm hätte wohl nur "std::cout << "Hallo Welt" << std::endl;" sein können. Ich mein, da passiert nichts weiter als ein simulierter Mausklick per Tastendruck.



jkallup hat gesagt.:


> Und fürs lernen einer Programmiersprache ist ein Computer mit 4 Kernen viel zu viel overkill.



Sorry, ich werde gleich auf ebay schauen, dass ich einen Computer von 1980 finde. Wusste nicht, dass ich um programmieren zu lernen einen extra Computer kaufen muss.



jkallup hat gesagt.:


> aber gleichzeitig die ersten Kapitel überspringen und dann Fragen stellen



Die Mindestgrundlagen habe ich mir durchaus angeeignet. Ich finde nur es nur gar nicht motivierend einen Taschenrechner zu programmieren. Da überlege ich mir lieber etwas, was mich interessiert und versuche das hinzubekommen - da hab ich dann auch echte Motivation und bleib bei der Sache. Es steht Dir aber doch frei meine Fragen zu ignorieren.


----------



## jkallup (15. Juli 2017)

Hallo,

ich will Dir nicht die Motivation nehmen, vielmehr Tipps geben, wie Du an dem Thema lange dran bleibst.
Es macht keinen Sinn sich einen Gamer PC zu kaufen, der 2000 Euro kostet, nur, weil Du nun programmieren
lernen willst.
Wenn Du einen gebrauchten PC brauchst, ohne stelle ich mir das ein wenig scwierig vor, dann kann ich Dir einen
für unter 200 Euro besorgen.
Ich selbst arbeite gerade an einer Maschine von 2006.
Leicht ist man entmutigt, wenn man Fehler macht, und die Compiler das auch nicht explizit sagen, wie und wo der Fehler behoben werden kann/soll,
Klar, eine Meldung bekommst Du auf jeden Fall.
Meistens ist es bei C++ so, das man Bibliotheken arbeitet, die template techniken verwenden und der Ratenschwanz,
der entsteht, nicht vorformatiert ausgeben und gerade als Anfänger nicht geübet ist, die ganzen Symbole zu verstehen.
Dann ist es so, das man nichts von Fensterprogramm umsonst bekommt.
Gut, es gibt Express Versionen, aber die darf man nicht verkaufen, gleichwohl weitergeben für umsonst.
Gleiches gilt für die BORLAND Reihe, es gibt Testversionen, die man eingeschränkt nutzen kann und man  hat
eine Lizenz für einen Benutzer/PC aber die sind dann auch da ausgelgt, um erstmal reinzuschnuppern.
Die einzige und größte Community ist die OpenSource Community.
Es gibt fast nix, was es nicht gibt.
Aber Programme sind besser programmiert und debuggelt per Hand.
Gut, man muss sich da auch erstmal einarbeiten, aber wenn Du ein guter Programmierer werden willst,
dann musst Du Dein Programm schon im Kopf haben.
Der Computer ist nur Mittel zum Zweck für die Umsetzung Deiner Idee.
Schau mal: Ich finde es immer wieder lustig, wenn sich zwei Ehepartner finden und ein Haus bauen.
Meist wird da nicht ans altersgerechte wohnen gedacht.
Da wird keine ebene Dusche, sondern eine Wanne verbaut.
Fußbodenheizung im Keller verlegt - wann kommst Du da mal hin wenn Du 80 Jahre alt bist?
Und so ist es mit Computerprogrammen:
Die werden mit Werbung(bilder/banner) ugeklatscht, so dass sie unbrauchbar für Leute mit
einer Sehbeeinträchtigung leben müssen.
Siehe Brail schrift.
Das wäre doch mal ein richtiges Projekt für Dich oder?
Bastle doch mal mit Jave und Eclipse eine kleine App, die ein Button auf Dein SmartHandy anzeigt
und ggf. beim anclicken eine Meldung oder eine Audiodatei wiedergibt.
Dann eine Stufe höher, einfachen Text.
Dann noch eine Stufe höher, versuche das Internet vernüftig zu bedienen und suche mal bei
verschiedene Suchmaschine nach Brail schrift.
ggf. lernst Du sie ja auch und druckst dir ein (Daten)Blatt mit der Tabularbesetzung der Zeichen und
Bedeutungen aus.
Vielleicht hilft Dir ja einer in der Umgebung das ganze auf Folie zu drucken - geh einfach mal auf
die Suche.
So, und nun ist es Deine Aufgabe die angepasste Folie so auf Tablet zu fixieren, das Du als
sehender Die Stellen, and dennen ein Buchatbe/Zeichen ist in einer App bei Berührung ein Wort
ausgibt oder Buuchstaben ansagt. Auch hierzu kannst Du mal im Internet suchen.
Und dann, wenn Deine App fertig ist, kannst Du Dir einen Sponsor suchen, der Dir eine echte
Brailfolie plottet - so mit Kerben oder Punkten.
Für ein solches Vorhaben gibt es schon das nicht al zu Neue Crowfunding.
Bei Crowfunding kann man Sponsoren für Deine Projekte anlocken.
Am Anfang steht die Idee und das Produkt oder die Dienstleistung.
Dann überlegst Du, in welcher Zeit Du - tja ich sag jetzt mal "Werbung" betreiben willst.
Dabei gibst Du die benötigte Summe für Dein Projekt an, die in einer bestimmten Zeit zusammen
gecrwodet sein soll.
Haben sich Sponsoren gefunden und die Deadline ist erreicht, dann wird entschieden, ist das Projekt
finanzierbar oder nicht.
Wenn nicht, gehen alle gesponserten Crowds/Gelder wieder zurück an die Sponsoren.
Somit hast Du eigentlich kein Risiko, außer dem, das Du, wenn es zu einen Erfolg werden soll,
Werbung in der Form von Promos, Videos, Texte ,,,, machst.
Je mehr Werbung, desto mehr Interesse - oder auch nicht ;-D
Jedenfalls bleibt Crowdfounding für die risikofrei - außer Deiner Aktivitäten.
Es gibt Plattformen, die löschen die Promos von der Plattform und Du musst wieder von Neuen
beginnen. Andere hingegen behalten sie, und Du kannst unter anderen Namen eine neue Crowdpromo
starten.
Aber vorsicht: Auch nach der Promo ist vor der Promo!
Die Sponsoren wollen Dich sehen und wohin die Gelder fließen.
Da ist ein geben und ein nehmen.
Es gibt sicherlich viele helferlein hier im Forum, die Dich vielleicht bei Deinen Projekten helfen
wollen...??!!
Man muss halt Heute den Mund auf machen und auf die Leute zugehen.
Ok, nu aber Schluß mit dem gessabbel.

Auf Gutes Gelingen
Jens


----------



## cwriter (15. Juli 2017)

sheel hat gesagt.:


> Sorry, aber von diesem Beitrag kann ich praktisch nichts unkommentiert stehen lassen.


Naja, vielleicht kann man es diesmal nicht ganz so hart ausdrücken.



jkallup hat gesagt.:


> Es macht keinen Sinn sich einen Gamer PC zu kaufen, der 2000 Euro kostet, nur, weil Du nun programmieren
> lernen willst.


Ich habe hier 2 Computer aus dem Jahr 2009. Dual Cores, einen Centrino 2 Duo SU9400 mit 1.4GHz und einen mit Core 2 Duo mit 2.8 GHz. Projekte mit "nur" 25000 Zeilen Code kompilieren (ohne distcc) gerade mal eben für 1-3 Minuten, mit distcc vielleicht 45s.
Auf einem moderneren i5-6600T geht das in 30 Sekunden.
Solche alten Computer sind keine 200€ wert, wenn man für ein bisschen mehr als das doppelte mehr als doppelt so schnelle Maschinen bekommt.



jkallup hat gesagt.:


> Ich selbst arbeite gerade an einer Maschine von 2006.


Naja, alt ist nicht unbedingt schlecht. Aber ich lehne mich mal weit aus dem Fenster und sage: Viel mehr als einfache Textverarbeitung liegt da auch nicht mehr drin, von der Energieeffizienz reden wir schon gar nicht.
(Und klar geht wahrscheinlich alles noch, aber langsam, und Zeit ist Geld...)



jkallup hat gesagt.:


> Meistens ist es bei C++ so, das man Bibliotheken arbeitet, die template techniken verwenden und der Ratenschwanz,
> der entsteht, nicht vorformatiert ausgeben und gerade als Anfänger nicht geübet ist, die ganzen Symbole zu verstehen.


Da stimme ich sogar zu: C++ (vor allem C++11 aufwärts) ist sehr verwirrend für Anfänger. Allerdings gibt es hier im Forum ja (meistens ) kompetente Hilfe, sodass das ausgeglichen werden kann. Persönlich bin ich ein Anhänger der "C first, then C++"-Idealogie, aber ich gehöre dahingehend auch schon zum alten Eisen.



jkallup hat gesagt.:


> Dann ist es so, das man nichts von Fensterprogramm umsonst bekommt.
> Gut, es gibt Express Versionen, aber die darf man nicht verkaufen, gleichwohl weitergeben für umsonst.


Was?
"Express"? Meinst du VS Express? Das gibt's nicht mehr wirklich, heisst jetzt "Community" und ist auch für kommerzielle Zwecke kostenlos.
Für Fensterprogramme: Qt ist ebenfalls für kommerzielle Projekte kostenlos, LGPLv2. Hat halt nicht alle Features der Vollversion (wie auch VS), reicht aber locker für Einzelfirmen.



jkallup hat gesagt.:


> Gleiches gilt für die BORLAND Reihe, es gibt Testversionen, die man eingeschränkt nutzen kann und man hat
> eine Lizenz für einen Benutzer/PC aber die sind dann auch da ausgelgt, um erstmal reinzuschnuppern.


Was, die gibt's noch?
Gerade gegooglet: Nicht wirklich. Wurde aufgekauft.



jkallup hat gesagt.:


> Die einzige und größte Community ist die OpenSource Community.
> Es gibt fast nix, was es nicht gibt.
> Aber Programme sind besser programmiert und debuggelt per Hand.


Aha?
Sprichst du jetzt das Zusammenklicken von GUIs an (was hier 100% OT ist)?
Mittlerweile nutze ich den Qt Designer sehr gerne. Warum sollte ich mehrere Stunden in eine GUI stecken, die unter Qt schnell genug funktioniert und in wenigen Minuten erstellt werden kann? (Speziellere Dinge sind dann ein Krampf, genauso wie so einiges an Qt, aber was Besseres habe ich noch nicht gefunden).



jkallup hat gesagt.:


> Gut, man muss sich da auch erstmal einarbeiten, aber wenn Du ein guter Programmierer werden willst,
> dann musst Du Dein Programm schon im Kopf haben.


Nicht wirklich falsch, aber kennst du die _genaue_ Funktionsweise aller Bibliotheksfunktionen, die du je benutzt hast?
Eine gewisse Abstraktion ist immer nötig.



jkallup hat gesagt.:


> Schau mal: Ich finde es immer wieder lustig, wenn sich zwei Ehepartner finden und ein Haus bauen.
> Meist wird da nicht ans altersgerechte wohnen gedacht.
> Da wird keine ebene Dusche, sondern eine Wanne verbaut.
> Fußbodenheizung im Keller verlegt - wann kommst Du da mal hin wenn Du 80 Jahre alt bist?
> ...


Verstehe ich nicht.



jkallup hat gesagt.:


> Ok, nu aber Schluß mit dem gessabbel.


Äh ja.
Es wäre wohl weniger Gesabbel, wenn du eine Idee mal über mehr als einen Satz behältst und ausarbeitest.
Und was Crowdfunding mit Programmierung und diese mit Blindenschrift zu tun hat, verstehe ich auch nicht so ganz.
Und Eclipse und Java sind nicht C++ (und Finger weg von der JNI für GUIs...), und warum du erst GUIs für Anfänger verteufelst und dann GUIs für Android als Anfängerprojekt vorschlägst, verstehen wahrscheinlich auch nicht alle.



RoninSL hat gesagt.:


> Sorry, ich werde gleich auf ebay schauen, dass ich einen Computer von 1980 finde. Wusste nicht, dass ich um programmieren zu lernen einen extra Computer kaufen muss.






RoninSL hat gesagt.:


> Die Mindestgrundlagen habe ich mir durchaus angeeignet. Ich finde nur es nur gar nicht motivierend einen Taschenrechner zu programmieren. Da überlege ich mir lieber etwas, was mich interessiert und versuche das hinzubekommen - da hab ich dann auch echte Motivation und bleib bei der Sache.


Und das ist gut so! Kleiner Hinweis am Rande: Taschenrechner mit korrekter Prezedenzregeln sind durchaus sehr komplex und daher (zumindest von einem akademischen Standpunkt aus) recht spannend. Aber ich fand Taschenrechner auch langweilig, als ich mit C begann. Ein Projekt zu setzen und dieses dann zu verfolgen, bei Fragen zu fragen und ein bisschen Learning By Doing zu betreiben, ist sicher nicht schlecht. Kleine, gutgemeinte Warnung: Erwarte nicht gleich perfekte Projekte zu Beginn. Wenn ich heute meine ersten Projekte anschaue, schaudert mir. Aber das gehört zum Lernen dazu.



RoninSL hat gesagt.:


> Es steht Dir aber doch frei meine Fragen zu ignorieren.


Nein, hier bei Tutorials.de in der C/C++-Sektion sind wir im Keller angekettet und müssen für ein Butterbrot 5 Beiträge schreiben. Und wenn @sheel uns beim Faulenzen erwischt, dann werden wir 3 Stunden lang in die Strafzelle geschickt, wo wir im Laufrad Strom für die hauseigene Bitcoinfarm erzeugen müssen, damit sich @sheel in ein paar Jahren mit seinen Millionen zur Ruhe setzen kann. 
Keine Angst, @RoninSL, du machst alles richtig. Viel Spass bei deinen Projekten und dem Lernen! 

Gruss
cwriter


----------



## jkallup (15. Juli 2017)

cwriter.
bist du schwarze mann?
vielleicht robert blanko? - Ein bisschen Spaß muss sein ;-D


----------

