Hi!
Same time ago I wrote that console Harbour aplication in Windows 98 work
very slow when must dispaly any text.
So, look You this sample program (it work in normal not multithread mode
Harbour )
//** START
PROCEDURE main
LOCAL i,t
LOCAL xx:=" "
CLS
t:=SECONDS()
FOR i:= 1 TO 10000 // ONLY 10,000
@ 0,0 SAY "Normal"
@ 0,30 SAY i
NEXT
@ 0,40 SAY SECONDS()-t
@ 1,0 SAY "GET:" GET xx
READ
DISPBEGIN()
AutoConsoleRefresh() //default 50ms
t:=SECONDS()
FOR i:= 1 TO 1000000 // 1,000,000 !!!
@ 2,0 SAY "DISPBEGIN + AutoRefrash 50ms"
@ 2,30 SAY i
NEXT
@ 2,40 SAY SECONDS()-t
@ 3,0 SAY "GET 50ms:" GET xx
READ
AutoConsoleRefresh(200) //set 200ms
t:=SECONDS()
FOR i:= 1 TO 1000000 // 1,000,000 !!!
@ 4,0 SAY "DISPBEGIN + AutoRefrash 200ms"
@ 4,30 SAY i
NEXT
@ 4,40 SAY SECONDS()-t
@ 5,0 SAY "GET 200ms:" GET xx
READ
@ 6,0 SAY "GET 200ms with DISPEND():" GET xx
DISPEND() ; READ ; DISPBEGIN()
AutoConsoleRefresh(0) //OFF and kill thread
DISPEND()
RETURN
*****************************************
*****************************************
#pragma BEGINDUMP
#include <windows.h>
#include "hbapi.h"
#include "hbapigt.h"
//***************************************
DWORD MyThreadProc( LPDWORD lpParameter )
{
static DWORD nWait ;
static BOOL lLoop = TRUE ;
static BOOL lRun = FALSE ;
if ( !(*lpParameter) )
{
lLoop = FALSE ;
}
else
{
nWait = (DWORD) *lpParameter ;
lLoop = TRUE ;
if ( !lRun )
{
lRun = TRUE ;
while ( lLoop )
{
Sleep( nWait );
if ( hb_gtDispCount() == 1 )
{
hb_gtDispEnd() ;
hb_gtDispBegin() ;
}
}
lRun = FALSE ;
}
}
return 0 ;
}
//**************************************
HB_FUNC ( AUTOCONSOLEREFRESH )
{
static HANDLE hThread = NULL ;
DWORD ThreadId ;
static DWORD nWait = 50 ;
static lRun = FALSE ;
if ( HB_ISNUM( 1 ) )
{
nWait = (DWORD) hb_parnl( 1 ) ;
}
else
{
nWait = 50 ; //default value
}
if ( nWait > 0 ) // > 0
{
if ( lRun )
{
MyThreadProc(&nWait) ; //send new value
}
else
{ //make thread
hThread = CreateThread(NULL, NULL,
(LPTHREAD_START_ROUTINE) MyThreadProc ,
&nWait, NULL, &ThreadId);
lRun = !(hThread == NULL) ;
hb_retl( lRun ) ;
}
}
else //nWait <= 0
{
if ( nWait==0 && lRun )
{
ThreadId = 0 ;
MyThreadProc(&ThreadId) ; //send info "break loop"
WaitForSingleObject(hThread, INFINITE ) ; //wait for end thread
lRun = FALSE ;
CloseHandle(hThread) ;
hThread = NULL ;
hb_retl( TRUE ) ;
}
else
{
hb_retl( FALSE ) ;
}
}
}
#pragma ENDDUMP
//**** END ****
On my Windows 98SE I get result: (look so "normal" count only 10.000,
"refresh" 1.000.000)
normal refresh 50ms refresh 200ms
Window 62,89 4,78 4,72
Window+key 21,36 7,31 9,34
FullScreen 3,84 4,77 4,73
FullScreen+key 135,89 13,45 11,53
key- pressed any key
GET with 200ms is not good (freeze) but in 50ms work OK.
I get same probelm in code:
if ( hb_gtDispCount() == 1 )
{
hb_gtDispEnd() ;
hb_gtDispBegin() ;
}
after hb_gtDispCount() and before hb_gtDispEnd() aplication can
also call DISPEND() and ... thread set extra DISPBEGIN() , I don't know how
protect this.
Adam
--
View this message in context:
http://www.nabble.com/Same-idea-for-console-program-in-Windows-98-tp23946398p23946398.html
Sent from the Harbour - Dev mailing list archive at Nabble.com.
_______________________________________________
Harbour mailing list
[email protected]
http://lists.harbour-project.org/mailman/listinfo/harbour