Plugins en C++

Mijn idee was om de stamgasten ieder hun eigen thread te geven, maar ze moeten ook weten wat de anderen zeggen om daarop te kunnen reageren. Vandaar had ik een soort van "notulist" bedacht die registreert wat er gezegd wordt. En daar kunnen de stamgast-treads dan weer navragen wat er het meest recent gezegd is. Helaas kreeg ik met mutex de informatie niet tussen de thread uitgewisseld. Maar ik begrijp dat dat ook niet de juist aanpak is...
 
Een leuk idee maar het verkeerde concept. Als stamgasten met elkaar willen praten moet je ze niet allemaal in hun eigen kamer zetten ;)
 
Ik zal het maar positief bekijken. Mijn mislukte poging om het met threads te doen bevat een belangrijke les: gebruik alleen threads als het anders niet gaat.
 
En gelukkig is er vrijwel niets in de wereld wat niet ook anders gaat :) Plus singlethread is echt veel toegankelijker voor veel meer mensen, zat oude hardware die die programma's niet kan draaien en daar is ook wat voor te zeggen.
 
Helaas heb ik nu met single thread ook nog problemen. Zie een aangepast beginnetje van een progje in de bijlage. Dat levert deze output op:

output.png
 

Attachments

  • KROEGEN.cpp.zip
    1,2 KB · Bekeken: 32
Ik zal het maar positief bekijken. Mijn mislukte poging om het met threads te doen bevat een belangrijke les: gebruik alleen threads als het anders niet gaat.
Ja multithreading is echt een beetje overkill voor dit "probleem". Wat je zou kunnen doen is iedere stamgast een object maken en een (onzichtbare) gespreksleider die per "beurt" aan iedere stamgast meedeelt wat er is gezegd (en door wie). Iedere stamgast produceert een antwoord (kan leeg zijn) met een bepaalde score (gestuurd door bijvoorbeeld hoe dicht bepaalde steekwoorden in de zin passen bij de stamgast). De gespreksleider verzamelt alle antwoorden en selecteert degene met de hoogste score. De gespreksleider kan ook beslissen om iemand wiens antwoord al heel lang niet geselecteerd is voorrang te geven (score aan te passen)... en het anwoord dat geselecteerd wordt is de input voor de volgende "beurt". Zo wordt het een sequentieel iets.

Pseudo-code:

Code:
laatste_opmerking = NULL
gezegd_door = -1
while ( converstatie_loopt ) {
    hoogste_score = 0
    winnaar = -1
    for( stamgast = 0; stamgast < aantal_stamgasten; stamgast++ ) {
        antwoord[ stamgast ] = stamgast [i] -> geef_antwoord( laatste_opmerking, gezegd_door )
        if ( antwoord[ stamgast ]->score() > hoogste_score ) {
            hoogste_score = antwoord[ stamgast ] -> score()
            gezegd_door = stamgast
         }
    }
    laatste_opmerking = antwoord[ gezegd_door ]
    toon( gezegd_door, laatste_opmerking )
}

de "geef_antwoord" methode die je per stamgast implementeert kan allerlei aspecten van de "laatste opmerking" in beschouwing nemen. Bijvoorbeeld wie het gezegd heeft. Maar kan ook trilgeren op bepaalde steekwoorden in de opmerking. En hoe meer criteria erkent worden door de stamgast hoe hoger de score van het antwoord.

Ik heb niet de logica meegenomen waar de gespreksleider bijhoudt hoe vaak iemand iets zegt en daarmee misschien een wat genuanceerdere keuze kan maken in het winnende antwoord. Een veelspreker krijgt een negatieve bonus op z'n 'score' terwijl een stamgast met weinig winnende antwoorden een positieve bonus krijgt....
 
Dit zijn voor Klaas kenmerkende uitspraken:

"What's up?",
"Get a life!",
"Het zijn oplichters, stuk voor stuk!",
"Geloof je het zelf?",
"Alles draait om het geld.",
"Ach - wat maakt 't ook uit.",
"Het zal mijn tijd wel duren.",
"En tevreden roker is geen onruststoker.",
"De zweep erover, laat ze maar werken voor hun geld.",
"Later."
 
Wat je zou kunnen doen is iedere stamgast een object maken en een (onzichtbare) gespreksleider die per "beurt" aan iedere stamgast meedeelt wat er is gezegd (en door wie).

Zoiets heb ik ook geprobeerd. Mijn bedoeling was daarbij om iedere stamgast aan de hand van de laatste (of van de laatste twee) uitspraken van de anderen een passende reactie te laten geven. Maar ik kreeg de concurrency niet goed.
 
Helaas heb ik nu met single thread ook nog problemen. Zie een aangepast beginnetje van een progje in de bijlage. Dat levert deze output op:

Bekijk bijlage 3875317
Dat zit in je vector, je bent vergeten een komma toe te voegen na "Kim: Tot ziens mensen." waardoor deze de tekst er na word samengevoegd en je telling niet meer klopt.
 
Overigens gebruik je nog steeds multithreading (std::thread t(kroegTalk)), op dit moment voer je je programma uit op een thread buiten het programma om en wacht je op de terugkomst, terwijl je het in de thread van het programma zelf kan doen. Je hoeft niks met threads te doen als je singlethread werkt, ook #include <thread> is dan niet nodig. Je kunt de gehele code van kroegTalk in de main functiecall kwijt, nu word main aangeroepen die het gelijk weer doorgeeft naar een volgende functie, maar iets als dit is ook prima als je de functie sowieso al apart nodig gaat hebben. De return is impliciet altijd aanwezig, als je niks returned is dat identiek aan return 0.

int main(){
kroegTalk()
};

Hetzelfde geld voor rest(), ik snap niet wat je tracht te bereiken met deze functie, sleep wil je vrijwel altijd vermijden tijdens programmeren omdat je gewoonweg zegt tegen je programma dat 'ie moet stoppen en maar moet wachten tot het weer geroepen word. sleep_for is ook zeer inaccuraat in dat geval. Zonder de rest definitie, alle rest calls, threading en thread include prima code!
 
Heb de thread en de rest's verwijderd en dan werkt het programma inderdaad ook, maar dan wel in een razend tempo. Het is mijn bedoeling dat de uitspraken net als in het echt geleidelijk aan worden gedaan. Dus moeten ze dan ook een voor een op het scherm verschijnen zodat de gebruiker de gang van het gesprek "in real time" kan volgen.
 
Het loopt nu soepel. Zie progje in de bijlage. En dit is de output:

output.png


Is er een goed alternatief voor die sleeps? En verder moet ik nu nog programmeren met welke uitspraken de gasten op elkaar reageren.
 

Attachments

  • KROEGEN.cpp.zip
    1,1 KB · Bekeken: 23
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.)

De aspecten van vriendelijkheid/onvriendelijkheid en optimisme/pessimisme in de uitspraken van de stamgasten blijken vrijwel parallel te lopen lopen. Daarom volsta ik met de maat: positiviteit waarbij +1=positief, 0=neutraal en -1=negatief. Dit levert (bij mijn inschatting) onderstaande vector op:

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

Om het simpel te houden veronderstel ik nu de volgende relatie:

pos(U) = fs(stem, pos(U*), pos(U**))

Waarbij:

- pos(x) de mate van positiviteit van uitspraak x aangeeft.
- U de uitspraak is waarmee een stamgast op de direct daaraan voorafgaande uitspraken U* en U** reageert.
- "stem" de algehele stemming is die vooraf door de gebruiker is opgegeven.
- En fs voor stamgast s het specifieke kwantitatieve verband tussen de vermelde grootheden aangeeft.

De functie pos weten we al, maar de specifieke functies fs voor de stamgasten s moeten we nog bepalen.
 
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.

als ik het zou kunnen, ik heb geen aanleg voor DSP... een tijd geleden heb ik een java omgeving gemaakt voor Voltage Modular en heb ik 1 idioot simpele module gemaakt, maar dat is het dan. de omgeving heb ook niet meer, denk ik....

en ik heb ook geen ideeën; er is al genoeg gemaakt, waarmee ik, door programma's en plugins springend, zowat alles kan doen....

ik vind het leuk om dit draadje te volgen zo leer ik nog wat, zo zit ik nu uit te zoeken, waarom je in Class, een constructor hebt, nou ja, dat snap nu ineens wel, maar waarom er met pointers wordt gewerkt, dat herkende nog net: this->num.

dus ik leer wat mee.....

Een vector in C++ is net als een array in C, maar dan dynamisch, je kunt de grootte dus veranderen tijdens runtime. :)


aha! ik had al een vermoeden dat het Array achtig was, ik heb eens een YT vid bekeken over arrays in C (of C++, denk het laatste). weet dat ze statisch zijn. en verwant, zeer verwant met! pointers... aangezien je C en C++ blijkbaar door elkaar kunt gebruiken, goed.... nogmaals ik kan me verliezen in details, wat me nu niets oplevert; vroeger wel...

ik wist niet dat er ook een dynamisch type was, ook weer wat geleerd!

maar mijn "programmeurshart" klopt sneller bij zo'n draadje als dit.
ik heb nooit een opleiding gevolgd, of er werkelijk iets mee gedaan. (sja, tenzij je een krankzinnig groot project om websites mee te maken, meetelt, alleen gebruikt door iemand die animaties maakte, in de USA... ik maakte het voor mezelf, en verdween er -letterlijk haast- in.)

het heeft wél invloed gehad op hoe ik poëzie schrijf....
 
Back
Top