Newsgroup: it.comp.lang.vo-clipper
Titolo: rilascio CPU

buon week end,
come posso rilasciare la cpu durante un'elaborazione?
prima utilizzavo i messaggi della StatusMessage, ma ora quasto metodo,
se richiamato dalla shell mi da problemi
cordiali saluti
Nicoletta Serraino

 come posso rilasciare la cpu durante un'elaborazione?
In quale linguaggio?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

se richiamato dalla shell mi da problemi
Puoi creare una procedura in ASM con queste istruzioni:
	push	ax
	mov	ax, 1680h
	int	2Fh
	pop	ax
ciao, acc.   
a...@libero.it

Scusate l'imprecisione,
sviluppiamo in VO 2.5 (patch b1)
durante l'eleborazione richiamiamo una funzione per la messaggistica
delle operazioni in corso, che fino ad oggi abbiamo visualizzato sulla
statusbar della shell
la funzione esegue la seguente istruzione
        SysObject():StatusMessage(cMessaggio,MESSAGEMENU)
Questa istruzione dalla patch b ha cominciato a dare alcuni bound error
e talvolta il messaggio non è visibile. In ogni caso questo metodo credo
contenga istruzioni per liberare risorse della cpu. Attendiamo con ansia
la patch c.
grazie
Nicoletta
In ogni caso


.grazie,  scusa l'ignoranza, ma come faccio ad utilizzarla? sviluppo in VO
2.5, c'è un modo per richiamare le istruzioni assembler direttamente in vo?
Nicoletta


 sviluppiamo in VO 2.5 (patch b1)
Perche' non provi con la patch b3 ?
Ciao,
    Fabrizio Malaguti

2.5, c'è un modo per richiamare le istruzioni assembler direttamente in vo?
Non uso VO, quindi regolati di conseguenza, pero' qualcuno qui sull'NG
ha detto che da VO puo' chiamare funzioni C e ASM, pertanto credo si
possa fare. Eventualmente se non hai un assemblatore puoi implementare
una funzione in C tramite l'asssembler inline. Segue un esempio:
void Slice(void) {
	_asm {
		push	ax
		mov	ax, 1680h
		int	2Fh
		pop	ax
	}
}
Se il compilatore C non supporta l'assembler inline, puoi usare questa
forma:
void Slice(void) {
	union REGS r;
 
r.x.ax
 = 0x1680;
	int86(0x2F, &r, &r);
}
Se non hai neanche il compilatore C...
Hei ma ce l'hai il PC ???
Scherzi a parte, verifica la dichiarazione della funzione, molto
probabilmente VO ha bisogno di qualche modifica.
Se qualche esperto VO e' in ascolto si faccia sentire, credo sia di
interesse generale.
ciao, acc.   
a...@libero.it

Eccomi.
Occorre acquistare il VO 2.5 SDK. Li ci sono tutte le spiegazioni di come
interfacciare il C e l'ASM direttamente da VO (oltre che i sorgenti
dell'interfaccia GUI di VO stesso e tante altre belle cose).
Comunque mi sembra di ricordare che sia come il CLIPPER 5.2
Ciao,
    Fabrizio Malaguti
"acc" <a...@libero.ita> ha scritto nel messaggio
news:1r6u5usfen8kb6f7c...@4ax.com...


 ha scritto nel messaggio
news:3C5E8E49...@re.nettuno.it...


Oppure chiedo scusa per non aver capito nulla.
Si tratta di rilasciare la cpu nei punti dove e' possibile (anzi
doveroso) farlo, cioe' ad esempio mentre il programma attende la
pressione di un tasto (caso questo tipicamente Clipper).
Oppure anche nel bel mezzo di elaborazioni "pesanti" per dare un po'
di respiro anche ad altre applicazioni, tieni presente che spesso
l'entita' di tempo richiesta e' inferiore al centesimo di secondo.
Quello che mi suona strano e' che VO abbia di questi problemi, capisco
Clipper, ma VO essendo nato in ambiente Windows dovrebbe gia'
prevedere determinati meccanismi ?!?
ciao, acc.   
a...@libero.it

prevedere determinati meccanismi ?!?
Infatti leggendo il tread non ho ben capito cosa si intende per "
rilasciare la CPU in VO"
La riga
SysObject():StatusMessage(cMessaggio,MESSAGEMENU)
non fa altro che scrivere un messaggio (cMessaggio) nella barra di
stato di una Shell Window.
Probabilmente dopo questa chiamata ci vuole una chiamata
ApplicationExec(EXECWHILEEVENT)
che permette di elaborare la coda degli eventi in attesa e, quindi,
permette eventuali refresh del video.
E' anche probabile che non abbia capito niente, se così, me ne scuso
in anticipo :-)
===============================================
Antonello Negrone - Biella - Italy
anto...@anc-software.it
www.anc-software.it

 E' anche probabile che non abbia capito niente, se cosě, me ne scuso


 E' anche probabile che non abbia capito niente, se cosģ, me ne scuso


O sbaglio?
Si e no...
Beh, premesso che di VO non so nulla (cominciamo bene!)
Il comportamento e' diverso a seconda che si tratti di una versione a
16 bit (in tal caso non c'e' speranza), o a 32 bit.
In quest'ultima ipotesi le cose migliorano, e secondo me non
dovrebbero esserci problemi se la task VO e' in background.
Per ovviare ai problemi dei 16 bit esiste un'apposita chiamata (credo
si chiami YELD o qualcosa del genere) al sistema operativo, da
inserire all'interno del ciclo.
Nel caso la chiamata non venga sfruttata (nessun'altra task in
esecuzione) l'overhead introdotto e' minimo, approssimativamente 8
microsec (Athlon 800/win98).
ciao, acc.   
a...@libero.it

 inserire all'interno del ciclo.
Infatti. Con le Fivewin esiste la funzione SYSREFRESH() e con il Visual
Basic la DoEvents(). In pratica dovrebbero corrispondere al seguente
codice C:
while ( GetMessage( parametri ) )
      DispatchMessage( altriparametri);


impossibile fare alcunchè nel frattempo.
Infatti è impossibile fare alcunchè all'interno del processo in
questione (quindi della tua applicazione) durante un ciclo WHILE, ma
puoi benissimo utilizzare altri programmi.
Se pero' vuoi creare una sorta di elaborazione in background puoi
mettere prima dell'istruzione ENDDO la riga
ApplicationExec(EXECWHILEEVENT)
In questo modo, ad ogni ciclo, viene elaborata la coda degli eventi di
sistema e, quindi, vengono gestiti, ad esempio, i movimenti e i click
del mouse all'interno della tua applicazione.
Credo che il discorso sia valido anche per gli altri prodotti a 32bit.
Per quelli a 16bit invece mi pare che la limitazione sia proprio data
dal fatto che senza una chiamata alla funzione YIELD (o qualsiasi essa
sia ) non si possano utilizzare neanche altri programmi.
Spero di essere stato comprensibile :-)


 sia ) non si possano utilizzare neanche altri programmi.
Esattamente. Ma alla fine il risultato è lo stesso: puoi utilizzare
quello che ti pare basta che chiami l'apposita funzione di cui sopra.


 ha scritto nel
messaggio news:3C63C189...@emagsoftware.it...


 Oppure non è cosi?
Boh, esattamente non l'ho capito ma a me sembra che anche se il monitor
di sistema indica un utilizzo della CPU al 100% in realtà non si nota
nessun rallentamento nel funzionamento delle applicazioni. Forse
l'importante è che l'applicazione che tiene la CPU impegnata la rilasci
abbastanza spesso da permettere anche alle altre di funzionare.


Oppure non è cosi?
Questo verra' deciso dal S.O. in base alle priorita' ed allo stato dei
due Task. Ad esempio, ipotizzando che abbiano la stessa priorita'
faranno fifty-fifty (con una leggera preferenza per la task attiva).
ciao, acc.   
a...@libero.it

Ehm, credo che VO non sia multithreading...forse intendevi Task?
Si possono fare tranquillamente applicazioni multithreading.

Si possono fare tranquillamente applicazioni multithreading.
Non ho trovato nulla a riguardo nella documentazione dell'SDK.
ciao, acc.   
a...@libero.it

Non ho trovato nulla a riguardo nella documentazione dell'SDK.
E questo a cosa serve?
CreateVOThread() Function
Purpose
Create a new thread.
Syntax
CreateVOThread(<pSecAttr>, <nStackSize>, <pFunc>, <pParam>, <dwFlags>,
<pdwID>) ---> pHandle
Arguments
<pSecAttr>	Pointer to a _WINSECURITY_ATTRIBUTES structure that
determines whether the returned handle can be inherited by child
processes.  If lpThreadAttributes is NULL, the handle cannot be
inherited.  For more information, see the WIN32 function,
CreateThread().
<nStackSize>	Stack size in bytes for the new thread.  If this
argument is 0, the stack size defaults to the same size as that of the
primary thread of the process.
<pFunc>	Entry point of the new thread, typically the address of a
function declared with the PASCAL calling convention.  Its prototype
is: ThreadFunc( pArguments AS PTR ) AS DWORD PASCAL.
<pParam>	Pointer or any other 32-bit parameter passed to the
thread entry point <pFunc> as the argument.
<dwFlags>	Additional flags to control the thread creation.
Note:  Consult your Microsoft Win32 Software Development Kit
documentation for detailed information about the WIN32 function,
CreateThread().
<pdwID>	Pointer to a DWORD that receives the thread identifier.
Returns
Handle of the new thread, if successful; otherwise, NULL_PTR.
Description
CreateVOThread() is a wrapper function for the Win32 function,
CreateThread(). All arguments are passed to that function after
notifying the runtime that a new thread is created by a CA-Visual
Objects process.
Examples
The following sample features three different threads:
STRUCT _THREADDATA
MEMBER nThread  AS INT
	// MEMBER xy    AS ...
FUNC Start
	LOCAL DIM adw[3]    AS PTR
	LOCAL DIM pData[3]  AS PTR
	LOCAL pTData        AS _THREADDATA
	LOCAL i             AS DWORD
	LOCAL nID           AS DWORD
 
	FOR i := 1 TO 3
		pTData := MemAlloc(_SIZEOF(_THREADDATA))
		IF pTData != NULL_PTR
	 		pTData.nThread := i
	 		pData[i] := pTData
		ENDIF
		adw[i] := CreateVOThread( NULL_PTR, 0,;
                          @__ThreadFunc(),;
                          pTData, 0,;
                          @nID )
NEXT
	WaitForMultipleObjects( 3, @adw, TRUE, INFINITE )
	FOR i := 1 TO 3
		IF pData[i] != NULL_PTR
		 MemFree(pData[i])
		ENDIF
	NEXT
	WAIT "DONE"
	RETURN NIL
STATIC FUNC __ThreadFunc ( pTData AS _THREADDATA )  AS DWORD PASCAL
	LOCAL i   AS DWORD
	LOCAL n   AS DWORD
	n := pTData.nThread
	FOR i := 1 TO 100
		_DebOut32("Thread " + NTrim(n) )
		 Sleep(1)
	NEXT
	ExitVOThread(0)
Prototype
CreateVOThread(pSecAttr AS PTR, nStackSize AS DWORD, pFunc AS PTR,
pParam  AS PTR, dwFlags AS DWORD, pdwID AS DWORD PTR) AS PTR PASCAL
Library
System Library

VO è MultiThread.
Replay del mio dubbio:
La priorità la gestisce il SO. Posso io assegnare il 70% della mia (mio
programma running VO) CPU ad un Thread ed un 30% all'altro appena creato?
... oppure il primo è prioritario ed il secondo avrà quello che il SO gli
assegna?
Ciao
Massimo
"acc" <a...@libero.ita> ha scritto nel messaggio
news:orj86ucrqs78cs0di...@4ax.com...


assegna?
Il Thread viene sempre creato con priorita' "normal".
Successivamente puoi usare la SetThreadPriority() per modificarne la
priorita'.
ciao, acc.   
a...@libero.it

assegna?
Nel file win32sdk la funziona CreateProcess (che serve ad avviare un
nuovo processo, ergo un'appicazione) ammette alcune costanti che
determinano la prorità del nuovo processo:
HIGH_PRIORITY_CLASS, IDLE_..., NORMAL_..., REALTIME_....
