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

Reply via email to