Newsgroup: it.comp.programmare.win32
Titolo: MSDEV & Windows (XP)

Non mi stupirņ mai di trovare difetti nei programmi M$.
Per motivi di ricerca ho dovuto implementare un piccolo multitasker: ho
usato semplicemente le 3 funzioni
CreateThread,
GetThreadContext e
SetThreadContext
Ho utilizzato soltanto 2 thread: il thread principale si occupa dello
switching e il thread secondario rappresenta la CPU virtuale.
Ho serializzato il tutto in modo che lo switching avvenga solo alla chiusura
di un MessageBox (tanto č solo un test).
Ho messo dei breakpoint sulla funzione di Switching e su quella eseguita dai
thread virtuali (soltanto 3 per ora) e ho notato i seguenti problemi:
1) MSDEV molto spesso non identifica la riga di codice sorgente e mostra il
listato assembly;
2) vengono rilevati breakpoint inesistenti (5 prima di arrivare ai 2 reali
impostati da me);
3) Dopo qualche switching MSDEV si appropria di tutta la CPU e non č
possibile nemmeno visualizzare il desktop.
Soluzione: SHIFT-F5 e un po' di pazienza.
Complimenti M$ per le potenti API rese disponibili per il debugging e
complimenti per l'intelligente utilizzo che ne viene fatto nell'MSDEV.
Kiuhnm

Stupendo. Questa volta ho tolto un breakpoint e si č bloccato dopo poco.
La cosa sorprendente č che l'utilizzo della CPU indicata dal Task Manager č
pari a 0!!! Va tutto lentissimo, ma il TM non nota niente!
A dire il vero anche il TM va lentissimo...
Kiuhnm

 A dire il vero anche il TM va lentissimo...
qualcuno direbbe che se vuoi passare ad un altro os hai svariate alternative
altri si limiterebbero a dirti: pebkac
.. io mi chiedo.. perché ce lo dici?
Sbirish

 alternative altri si limiterebbero a dirti: pebkac
Certo certo, allora diciamo anche che è una feature, come suol dire sempre
zio Bill...
Kiuhnm

 wrote in message
news:AzS0a.200577$AA2.7...@news2.tin.it...

O forse lo strumento non è stato congeniato abbastanza bene per l'utente
medio.
Sbirish

 l'utente medio.
Certo, del resto alla M$ contano sul fatto che l'utente avanzato modifichi
Win ad hoc ogni volta che scopre un problema.
Probabilmente basterebbe modificare lo scheduler di WinXP o forse l'intero
kernel. Perň a questo punto non č piů conveniente e penso che farň prima a
modificare il kernel del mio OS. Speravo di verificare prima l'idea in
Windows. Peccato: ci metterň qualche settimana in piů del previsto, ma
pazienza.
Kiuhnm

 virtuale. [...]
Per fare delle cose del genere di solito si usano i fiber, che non
vengono schedulati individualmente e quindi ti permettono di
sperimentare algoritmi di scheduling, monitor e quant'altro. Non mi pare
una buona idea andare a litigare con lo scheduler di windows, bella
grazia se non ti va tutto in crash.
--
Lorenzo

 bella grazia se non ti va tutto in crash.
Non mi pare di essermi messo a litigare con lo scheduler e non vedo perchč
dovrebbe andare tutto in crash, dato che utilizzo soltanto API documentate e
parametri documentati.
Creo 2 thread. Un thread rappresenta la CPU virtuale e l'altro thread
(quello principale) esegue lo switching.
La funzione di switching č qualcosa del genere:
while (1)
{
    Switch();
    Sleep(50);        // o anche 100
}
Il thread che esegue i thread virtuali viene manipolato da Switch
semplicemente con:
SuspendThread();
GetThreadContext();        ---> virtual_regs del thread corrente
SetThreadContext();        <--- virtual_regs del nuovo thread
ResumeThread();
[modifico soltanto i registri generici + eip, esp, ebp]
Come vedi non ho fatto a pugni proprio con nessuno.
L'MSDN dice:
"You cannot get a valid context for a running thread. Use the SuspendThread
function to suspend the thread before calling GetThreadContext."
e ancora:
"Do not try to set the context for a running thread; the results are
unpredictable. Use the SuspendThread function to suspend the thread before
calling SetThreadContext."
I fiber (o le fibre) non offrono sufficiente controllo. Che cosa fanno oltre
a non eseguire lo switch automaticamente e a metterti a disposizione la
funzione SwitchToFiber? Niente: non posso neanche modificare i registri come
voglio.
Kiuhnm