Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: A Delphi - WinBoard problem

Author: Odd Gunnar Malin

Date: 01:39:46 09/25/04

Go up one level in this thread


On September 25, 2004 at 01:06:33, Andrey Popov wrote:

>The best way is to use PeekNamedPipe and ReadFile functions from the "windows"
>unit.
>You can ask whether some input is available (through PeekNamedPipe).
>If there are some characters or PeekNamedPipe returned "false"
>then ReadFile.

Since he have the input in its own thread he do not need to peek the input
first.

Here is my routine for exactly this task in C++.
It is for use in many programs but for reading gui message it set:
it->hRead=GetStdHandle(STD_INPUT_HANDLE);

void InputThread::threadLoop(void* lpv)
{
  char   c;
  InputThread* it=(InputThread*)lpv;
  string line="";
	DWORD dwRead;
  DWORD dwError;
  it->abortcode=0;
  while (!it->abort)
  {
    if (it->hRead==NULL)
      break;
    if (!ReadFile(it->hRead, &c, 1, &dwRead, NULL))
    {
      dwError=GetLastError();
      if ((dwError==ERROR_BROKEN_PIPE) || (dwError==ERROR_HANDLE_EOF))
//      if (dwError==ERROR_HANDLE_EOF)
      {
        it->abortcode=dwError;
        break;
      }
    }
    if (dwRead)
    {
      if (c=='\n')
      {
        if (it->callbackFunc!=NULL)
        {
          if (!it->callbackFunc(line.c_str(),it->callbackData))
          {
            it->abortcode=-1;
            break;
          }
        }
        line="";
      }else if (c!='\r')
      {
        line+=c;
      }
    }
  };
  _endthread();
}

it->abortcode is just to give some info in the logfile.

Odd Gunnar



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.