c # - en GUI til at overvåge tusindvis tråde

Indlæg af Hanne Mølgaard Plasc

Problem

For akademiske formål har jeg realiseret et C # bibliotek, der implementerer 'beregning med agenter', tænker for eksempel på, hvad JADE gør. Med dette bibliotek kan jeg nemt implementere en distribueret beregningsalgoritme. Hver agent er et objekt med en anden tråd, der implementerer en del af beregningen, mens selve objektet forbliver frit for at modtage og sende meddelelser.
Disse algoritmer kan køre tusindvis af agenter (så tråde), overvåget af en superagent, der ændrer deres status og synkroniserer dem: Jeg kan ikke oprette 10.000 tråde og lade dem løbe sammen, fordi pc kunne dø ...
Så hver agent har en skiftende status, som jeg skal tegne på en GUI for at lade brugeren forstå, hvad der sker under beregningen. Og mine agenter kan oprettes og dræbes under beregning også, hvilket gør det sværere ...
Jeg tænkte at bruge et gitter, hvor hver celle er en agent, ændrer baggrundsfarven på hver celle i henhold til agentstatus, men jeg er ikke sikker på, hvordan man kan 'være med' enkeltagent til en celle (husk jeg kan ikke bruge et indeks, fordi agenter nummer kan ændres, og nogle agenter kan ødelægges, jeg tænkte at oprette en kontrol for hver ny agent og placere denne kontrol i GUI'en, så jeg kan hurtigt oprette, placere og ødelægge det, når det er nødvendigt.
Big deal er det store antal tråde og behovet for at opdatere GUI så hurtigt som muligt, fordi tråde status ændres kontinuerligt og meget hurtigt.
Hvad kan du foreslå? Hvad er den bedste måde at udføre min opgave på? UPDATE: Jeg udvikler dette bibliotek ved hjælp af Framework 2.0, fordi det skal køre under Linux også med Mono.

Bedste reference

Har en centralsynkroniseret hashmap, der kortlægger thread id -> GUI element. På denne måde kan superagenten foretage ændringer i GUI'et, oprette nye tråde og opdatere hashmapet atomvist (fx dette tillader genbrug af GUI-elementer til nye tråde). Dette vil naturligvis medføre, at nogle læser påstand på hashmapet, når superagenten får en lås for at opdatere den. rediger: faktisk kan du endda slippe af med hashmap og bare have en matrix, fordi det maksimale antal tråde du kan have, er ret lavt (< 2 ^ 16), tror jeg. Dette ville også slippe af med påstanden, fordi du kunne låse single array elementer i stedet for hele hashmap. edit2: Det er faktisk lige sket for mig, at du kan slippe af med alt. Har bare en delt overflade på 256x256 pixel (dvs. 2 ^ 16 pixel). Hver pixel tilhører den tråd, hvis trådID er lig med pixelindekset. På den måde får hver tråd kun sin egen pixel. Derefter oprette en brugerdefineret kontrol og få OnPaint-metoden til at blitke den delte overflade til den grafiske overflade.

Andre referencer 1

Jeg ville gøre dette med en Infragistics WinGrid i ubundet tilstand. På denne måde kan du nemt forbinde agentobjektet med en celle mærke og finde cellen ved at søge efter tags. Jeg vil ikke foreslå dig at bruge en enkelt kontrol for hver agent, fordi du måske oplever store præstationsproblemer!

Andre referencer 2

Jeg ville ikke gøre det i. NET rent, for farmewok er næsten ikke powerfull nok til det. Udvej til MFC eller bedre Direct3D eller, hvis du har brug for Linux-support, OpenGL. Det kan være en overhead, men du har absolut ikke vundet løbe i opdateringsproblemer (i det mindste ikke i GUI'et)