Plugins en C++

Ik heb weer wat vorderingen gemaakt maar kan het niet laten zien want:

probleempje.png
 
Met threads werken brengt weer hele andere uitdagingen met zich mee: Inter-thread communication, shared memory, asynchroniteit, dead-locks, etc. Dit zijn wel concepten die belangrijk zijn om door te hebben en worden uitgelegd in veel verschillende boeken & tutorials.
 
Daarom ben ik er ook mee aan het oefenen. En om te beginnen met heel simpele gevallen zoals kroegenpraat. ;-)
 
Ik programmeer al decennia vrij complexe zaken in C++ (game engines from scratch bv). Dat is een van de weinige dingen waar ik zou zeggen dat het wel nuttig is, en zelfs dan gebruik ik het niet. Niet omdat ik het niet eerder heb gebruikt of werkt, maar omdat het de moeite en complexiteit gewoonweg niet waard is. De codebase simpeler houden met een singlethread loop heeft ook zijn eigen voordelen, vooral als je wilt dat je programma zo toegankelijk mogelijk is voor mensen met verschillende hardware, wat voor mij een van de belangrijkste aandachtspunten is. Een singlethread loop gaat het 'em altijd doen, met multithreading geen garantie. Een van de redenen waarom als ik wel multithreading gebruik, ik ook een singlethread optie schrijf om op terug te vallen als de hardware het niet aan kan.

Maar ze zijn wel heel boeiend :)
 
Ik denk ook niet dat C++ mijn favoriete taal gaat worden, als ik enig idee heb wat er staat ben ik tevreden. Veel in andere talen geschreven audio programma's worden uiteindelijk toch in C++ of C omgezet, en dan is het leuk om daar ook weer wat vanaf te weten. Maar details zijn onnodig. Met bijvoorbeeld FAUST of PureData kan ik eigenlijk al alles wat ik op software gebied zou willen.
 
Ja precies, uiteindelijk word het toch C++ haha.
Ik ben ook fan van metaprogramming met templates in C++ zodat je het programma op runtime nieuwe code kunt laten genereren en toe te voegen, zonder te recompilen. Kan wel een mindfuck zijn, maar dat zijn threads ook maar wel veel minder gebruikelijk.
 
Ik kan de code niet meer als code posten, dus dan maar als aanhangsel. Dat progje levert als output dit op:

----------------------------------------------------------------------------------------------------------------------------------------------------------
WE GAAN OPEN!
Piet: Oioi - en we nemen er nog een!
Marie: Goedenavond.
Kim: Dag mensen.
Klaas: What's up?
Jan: Hallo luitjes.
Piet: Oioi - rb we nemen ul nog een!
marie1
kim1
klaas1
jan1
marie2
Piet: Ovol - en wl nmlun ul zog eun!
kim2
klaas2
jan2
marie3
Piet: Oiol - lu ew nueen er log wen!
kim3
klaas3
jan3
klaas4
kim4
marie4
Piet: Oole - me wel emel ze lonn ln!
klaas5
kim5
marie5
Piet: Oooolel mel emal noomomostr pr...
jan4
kim6
klaas6
marie6
Piet: Oolalola l mel emal przogllelel...
jan5
klaas7
kim7
marie7
Piet: Aalooelablubbluummm...blup..blu...
jan6
Klaas: Later.
Kim: Tot ziens mensen.
Marie: Hoog tijd – dag allemaal!
Jan: Zo luitjes, ik ben pleite!
WE GAAN SLUITEN!

(program exited with code: 0)
Press return to continue

-------------------------------------------------------------------------------------------------------------------------------------------------------

De tussenliggende uitspraken van Jan, Marie, Kim en Klaas moeten nog bepaald worden, en dat wil ik generatief doen zodat ze ook echt op elkaar reageren. Of dat de threads zal vernielen gaan we zien. ;-)
 

Attachments

  • progje.cpp.zip
    925 bytes · Bekeken: 12
Voor het gemak ga ik werken met vectoren van strings:

Code:
#include <bits/stdc++.h>


   std::vector<std::string> vecJan = {
       "Jan: Hallo luitjes.",
       "Jan: Wat een geleuter!",
       "Jan: Geen gezeik, iedereen rijk. ",
       "Jan: Wat een lol!",
       "Jan: Brand is erger!",
       "Jan: Kop op!",
       "Jan: En wat dan nog...",
       "Jan: Iedereen OK?",
       "Jan: Ik zeg maar zo, ik zeg maar niets.",
       "Jan: Zo luitjes, ik ben pleite! "
   };
    
   std::vector<std::string> vecMarie = {
      "Marie: Goedenavond.",
      "Marie: Hoe gaat het hier?",
      "Marie: Oh – de heren weten het weer beter...",
      "Marie: Nou nou!",
      "Marie: Kom op – de polonaise!",
      "Marie: Laten we het gezellig houden.",
      "Marie: Het kan altijd erger – wees blij met wat je hebt.",
      "Marie: Pluk de dag.",
      "Marie: Van het concert des levens krijgt niemand een program.",
      "Marie: Hoog tijd – dag allemaal!"
   };
    
   std::vector<std::string> vecKim = {
      "Kim: Dag mensen.",
      "Kim: Peace!",
      "Kim: Ieder zijn ding.",
      "Kim: Respect!",
      "Kim: Wat een puinhoop weer in de wereld!",
      "Kim: Wie bedoel je daarmee?",
      "Kim: Als we nu eens wat liever voor elkaar zouden zijn...",
      "Kim: Een rondje van mij.",
      "Kim: Ik hou van jullie.",
      "Kim: Tot ziens mensen."
   }; 
    
   std::vector<std::string> vecKlaas = {
      "Klaas: What's up?",
      "Klaas: Get a life!",
      "Klaas: Het zijn oplichters, stuk voor stuk!",
      "Klaas: Geloof je het zelf?",
      "Klaas: Alles draait om het geld.",
      "Klaas: Ach - wat maakt 't ook uit.",
      "Klaas: Het zal mijn tijd wel duren.",
      "Klaas: En tevreden roker is geen onruststoker.",
      "Klaas: De zweep erover, laat ze maar werken voor hun geld.",
      "Klaas: Later."
   }; 
    
   std::vector<std::string> vecPiet = {
      "Piet: Oioi - en we nemen er nog een!",
      "Piet: Oioi - rb we nemen ul nog een!",
      "Piet: Ovol - en wl nmlun ul zog eun!",
      "Piet: Oiol - lu ew nueen er log wen!",
      "Piet: Oole - me wel emel ze lonn ln!",
      "Piet: Oooolel mel emal noomomostr pr...",
      "Piet: Oolalola l mel emal przogllelel...",
      "Piet: Aalooelablubbluummm...blup..blu..."
   };
 
Hoe de stamgasten reageren op de uitspraken van anderen hangt onder meer af van:

- Hun eigen karakter.
- De algehele stemming.
- De vriendelijkheid of onvriendelijkheid van andermans uitspraken.
- De optimistische of pessimistische aard van andermans uitspraken.

(Meer inhoudelijke gesprekken zal ik niet modelleren.)
 
Code ziet er goed uit!
Misschien kun je een extra lijstje maken met 'kleurende' begin of eindzinnetjes? "Omdat je zo lief bent " of "Ik weet het niet maar " of "Zo pessimistisch zie ik het niet want "
waar je dan een meer inhoudelijke zin aan vast kan plakken? Dan heb je opeens veel meer combinaties en kun je de begin en eindzinnen aanpassen naar die variabelen.
 
Ik wil het niet te ingewikkeld maken. Dit is maar om zo wat te oefenen. Zodra ik het boek over het zelf schrijven van modules voor VCV Rack in huis heb ga ik met audio aan de slag. Dat vind ik ook veel leuker.
 
Hoe de stamgasten reageren op de uitspraken van anderen hangt onder meer af van:

- Hun eigen karakter.
- De algehele stemming.
- De vriendelijkheid of onvriendelijkheid van andermans uitspraken.
- De optimistische of pessimistische aard van andermans uitspraken.

Eerste karakterisering van de stamgasten:

Jan moet niets hebben van geklaag, en zal daar tegenin gaan.
Marie probeert het gezellig te houden door de discussie bij te sturen.
Kim is ideologisch bevlogen maar wil tegelijkertijd lief over te komen.
Klaas is een botte hork.
Piet is een drankorgel en reageert niet op anderen.

De algehele stemming (positief = +1, neutraal = 0 of negatief = -1) laat ik aan de gebruiker om vooraf te kiezen.
 
vectoren ken ik niet...

ik vind C++ wel een mooie taal, al beheers ik deze niet.

C is wat ik kon, lang gelee....

dus volg dit draadje om wat te leren...

ik heb zelf geen doelen, voor C++ anders zou ik het zeker leren.

Ik wil C++ gaan gebruiken om zelf modules voor VCV Rack te schrijven. Of dat ook lukt moet nog blijken, maar dat zou voor jou ook interessant kunnen zijn.
 
vectoren ken ik niet...

ik vind C++ wel een mooie taal, al beheers ik deze niet.

C is wat ik kon, lang gelee....

dus volg dit draadje om wat te leren...

ik heb zelf geen doelen, voor C++ anders zou ik het zeker leren.
Een vector in C++ is net als een array in C, maar dan dynamisch, je kunt de grootte dus veranderen tijdens runtime. :)
 
Ik programmeer al decennia vrij complexe zaken in C++ (game engines from scratch bv). Dat is een van de weinige dingen waar ik zou zeggen dat het wel nuttig is, en zelfs dan gebruik ik het niet. Niet omdat ik het niet eerder heb gebruikt of werkt, maar omdat het de moeite en complexiteit gewoonweg niet waard is. De codebase simpeler houden met een singlethread loop heeft ook zijn eigen voordelen, vooral als je wilt dat je programma zo toegankelijk mogelijk is voor mensen met verschillende hardware, wat voor mij een van de belangrijkste aandachtspunten is. Een singlethread loop gaat het 'em altijd doen, met multithreading geen garantie. Een van de redenen waarom als ik wel multithreading gebruik, ik ook een singlethread optie schrijf om op terug te vallen als de hardware het niet aan kan.

Maar ze zijn wel heel boeiend :)
Dit is wel een valide punt overigens. Vaak zijn threads onnodig en zorgt het onnodig voor extra complexiteit
 
Mooi - ik zit nu met een probleem (ja inderdaad met die threads) waar ik niet uit kom. Ik wil een variabele in de ene thread vanuit een andere thread kunnen veranderen. Hoe gaat dat?
 
Als het echt moet met std:mutex of std:atomic voor simpele variabels, maar het liefst gewoonweg niet - Het gebruikelijke idee is dat je een hoofd thread hebt en taken uitdeelt aan threads en daar de resultaten van terugkrijgt of dat alle threads uniek werk doen, eventueel een queue. Threads die andere threads aanspreken wil je zoveel mogelijk vermijden, dan verlies je ook een groot voordeel van multithreading.

Als je variabelen in andere threads gaat veranderen is er vrijwel geen zekerheid dat het op dat moment kan en er niet tegelijk een andere thread naar wil schrijven waardoor je een data race krijgt. Dit is waar multithreading exponentieel complexer word dan singlethread en waar het het al niet meer waard is. Snelheid doe je het toch niet voor :)
 
Back
Top