|
There's a Win32 API function called AnimateWindow() which provides this type of effect.
n!
|
|
|
|
|
I have some old perl code that I found in the book "Perl Database Programming" by Brent Michalski that I need to port to C++ for use with another project that needs in place array shuffling. I've analyzed the perl code back to front and am still not sure how implement the same thing in C++. For inspection, I have the full source for the perl subroutine with line by line comments verbatim from the book for those who don't have an understanding of perl following the source code:
<code>
1: sub fisher_yates_shuffle {
2: my $array = shift;
3: my $i;
4: for($i = @$array; --$i) {
5: my $j = int rand ($i+1);
6: next if $i == $j;
7: @$array[$i,$j] = @$array[$j,$i];
8: }
9: }
</code>
Line 1 begins the fisher_yates_shuffle subroutine. This subroutine is designed to take a reference to an array as the input, and it will randomize the items in the array in place. This means that we pass a reference to an array and the array gets randomized. This is a commonly used method for randomizing arrays, the "Fisher-Yates shuffle," named after Sir Ronald A. Fisher and Frank Yates, who introduced the algorithm in example 12 of their 1938 book Statistical Tables.
Line 2 declares a scalar variable named $array and shifts the value passed to the subroutine into it. This value should be a reference to an array.
Line 3 declares a scalar variable named $i
Line 4 begins a for loop that sets $i to the current value each time through the loop and also decrements $i. This has the effect of setting $i to the number of elements in the array @$array and then counting down one by one.
Line 5 declares a scalar variable named $j and sets it to a random integer between 1 and $i
Line 6 causes the for loop to skip to the next iteration if $i and $j are equal
Line 7 swaps the values at $array[$i] and $array[$j]
Line 8 ends the for loop that we began on Line 6
Line 9 ends this subroutine.
As I've said, I've been over this thing a dozen times, and a solution in C++ just isn't coming to me, so I'd appreciate any help that anyone woudl be will to provide. I think that the perl source I've included gives enough of a general idea of what needs to happen along with the source comments that a solution would be apparent to any seasoned programmer ( which when it comes to C I'm definately not ) Thanks in advance for any help that you folks can provide.
It's good to see kids turning their minds to wholesum activities such as programming, instead of wasting their lives in the hedonistic disciplines of Sex, Drugs, & Rock & Roll... or Sex with Drugs, or Sex with Rocks while Rolling in Drugs, or whatever new-fangled perversions you little monsters have thought up now...
[Shog9 on Kid Programmers]
|
|
|
|
|
template <class T>
inline void fisher_yates_shuffle(T* array, int size)
{
::srand(static_cast<unsigned int>(::time(0)));
//could be
for(int i = size - 1;i > -1;--i)
{
int j = ::rand() % i;//could be "::rand() % i + 1" I am not sure what "rand ($i+1)" stands for
if(i != j)
{
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
|
|
|
|
|
Almost...
The rand() % i should be rand() % (i+1) . Other than that, well done .
template <class T>
inline void fisher_yates_shuffle(T* array, int size)
{
srand(static_cast<unsigned int>(time(0)));
for(int i=size-1; i>-1; --i)
{
int j = rand() % (i + 1);
if(i != j)
{
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
Ryan
Being little and getting pushed around by big guys all my life I guess I compensate by pushing electrons and holes around. What a bully I am, but I do enjoy making subatomic particles hop at my bidding - Roger Wright (2nd April 2003, The Lounge)
Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late - John Nichol "Point Of Impact"
|
|
|
|
|
Very similar to Alex's reply above, except the rand() % i
should be rand() % (i+1) :
template <class T>
inline void fisher_yates_shuffle(T* array, int size)
{
srand(static_cast<unsigned int>(time(0)));
for(int i=size-1; i>-1; --i)
{
int j = rand() % (i + 1);
if(i != j)
{
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
Ryan
Being little and getting pushed around by big guys all my life I guess I compensate by pushing electrons and holes around. What a bully I am, but I do enjoy making subatomic particles hop at my bidding - Roger Wright (2nd April 2003, The Lounge)
Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late - John Nichol "Point Of Impact"
|
|
|
|
|
m_fileList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | LBS_MULTIPLESEL | LBS_EXTENDEDSEL | WS_VSCROLL | WS_BORDER | LBS_HASSTRINGS, rect, this, IDC_FILEFRAME_LISTBOX);
This CListBox Create works great and does everything that I ask it to do, but when I change it to:
m_fileList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | LBS_MULTIPLESEL | LBS_EXTENDEDSEL | WS_VSCROLL | WS_BORDER | LBS_HASSTRINGS | LBS_OWNERDRAWFIXED, rect, this, IDC_FILEFRAME_LISTBOX);
I get a debug error in WINCTRL1.CPP:
void CListBox::MeasureItem(LPMEASUREITEMSTRUCT)
{ ASSERT(FALSE); }
Any suggestions on how to fix this?
|
|
|
|
|
if you ownder draw the listbox (with LBS_OWNERDRAWFIXED) you need to add your own MeasureItem method.
It's best if you create your own class for it.
Maximilien Lincourt
For success one must aquire one's self
|
|
|
|
|
Thanks for the quick reply. Your suggestion did it!
|
|
|
|
|
Quick Q.
Are paths expressed in UNC form e.g: "\\network\some folder\file.txt"
accessed faster than when it is explicitly mapped:
e.g: "S:\some folder\file.txt"?
I vaguely remember reading somewhere that this is the case in which your pc does not have to re-find the UNC path everytime there is a connection.
--
"..Even my comments have bugs!"
Inspired by Toni78
|
|
|
|
|
Hi,
Still extremely new to MFC programming, so i am just trying to play around with some of the controls. I made a app that has a few dialogs...which I later put into a property sheet. I was wondering how I could make the window modeless...I don't have the MSDN library so I can't look up how to do this. I hear about a Create() function?
Any help would be appreciated.
Thanks in advance.
|
|
|
|
|
<br />
this->m_pPSEstacio = new CPSEstacio("", this, 0);<br />
<br />
this->m_pPSEstacio->Create(this, WS_CHILD | WS_TABSTOP | WS_VISIBLE);<br />
this->m_pPSEstacio->ModifyStyleEx(0,WS_EX_CONTROLPARENT);
this would be useful for creating a child property sheet... (take out the WS_CHILD and the WS_TABSTOP and the last code line...
then you'll get it...
Hope this helps...
|
|
|
|
|
Hi,
I got the propertysheet to come up with the correct look of what i want, but its still not modeless.
I am using the code:
sheet.AddPage(&tab1);
sheet.AddPage(&tab2);
sheet.AddPage(&tab3);
sheet.Create (this, WS_CHILD | WS_VISIBLE , 0);
sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);
sheet.ModifyStyle( 0, WS_TABSTOP, 0);
sheet.UpdateData(FALSE);
sheet.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
I thought to make a modal i would have to do sheet.DoModal? how come the create is doing a modal window too? Can some help me be modeless AND give an explanation why?
Any help is much appreciated. THANKS in advance.
|
|
|
|
|
If you want it modeless, and still "look" modal, just leave out WS_CHILD in the Create() call. You also won't need any of the lines under this one. This set of lines creates a property sheet that is embedded inside another dialog/window/property page.
Hope this helps,
Ryan
Being little and getting pushed around by big guys all my life I guess I compensate by pushing electrons and holes around. What a bully I am, but I do enjoy making subatomic particles hop at my bidding - Roger Wright (2nd April 2003, The Lounge)
Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late - John Nichol "Point Of Impact"
|
|
|
|
|
Hi,
Thanks for all your help.
I did what you suggested, but to no avail. It compiled, but when i went to the app it gave a couple of errors and then popped both windows up. First a blank dialog came up, and then the property sheet came up. Both are closed once I close the blank window. What I have as the code now is:
sheet.AddPage(&tab1);
sheet.AddPage(&tab2);
sheet.AddPage(&tab3);
sheet.Create (this, WS_VISIBLE , 0);
//sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);
//sheet.ModifyStyle( 0, WS_TABSTOP, 0);
//sheet.UpdateData(FALSE);
//sheet.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
BTW, sheet is instantiated like this:
CPropertSheet sheet;
tab1, tab2, tab3 are all Dialogs with base class of CPropertyPage
Am I doing something wrong?
PLEASE HELP.
Thanks in advance everyone.
|
|
|
|
|
Your code looks right.
What are the errors that come up? If they are MFC ASSERTs, can you get the filename and line number? From these, you should be able to trace back to see what the problem is. This code should work:
CPropertySheet sheet(_T("Sheet Title"));
sheet.AddPage(&m_Page1);
sheet.AddPage(&m_Page2);
sheet.AddPage(&m_Page3);
sheet.Create(); If this doesn't work, then I can't really help any more unless you can find out what's causing the errors.
Ryan
Being little and getting pushed around by big guys all my life I guess I compensate by pushing electrons and holes around. What a bully I am, but I do enjoy making subatomic particles hop at my bidding - Roger Wright (2nd April 2003, The Lounge)
Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late - John Nichol "Point Of Impact"
|
|
|
|
|
Hi All,
I'm the first to admit that I'm not to good at the design aspect of programming. So first I was wondering if anyone had any good suggestions on books that I could read that would help out with this topic. All comments are appreciated.
Second, I have a design question. I'm currently writing a program that uses a tabcontrol and I'd like end user to be able to dynamically add/remove/insert tabs into the program, now the problem is I'm not sure of the best way to implement this. I did design one version that used a checked listbox (in an options form) to allow the user to add/remove/insert "items", when the user clicked ok I would check what "items" had a check and create the tabs for them. Where I ran into a problem was that even items without a check need to be kept in memory so that when the user opens the options again they are still there (and it they check them they should be created, and vice versa) the other problem is that each tab has to have some data associated with it. What I did in the first design was have an array that I threw back and forth between the two forms, but that proved to be a very poor design. I'm just wondering if anyone has any better design that I could try I would really love to hear it. Any ideas or simple things to try would be extremely appreciated.
Thanks All!
- monrobot13
|
|
|
|
|
I highly recommend Modern C++ Design: Generic Programming and Design Patterns Applied by Andrei Alexandrescu.
Kuphryn
|
|
|
|
|
Hello
I got problems with serial communications, I use workerthread and overlapped io.
Everything works really nice on one computer, but on another one it dont.
ReadFiles overlapped read event doesnt get triggered, Writefile works as it should.
What can be wrong?
|
|
|
|
|
This code is run on both computer. The only diffrent setting is the comport.
If I connect to the port with hyperterminal I get OK.
DWORD Datatal::CSerialSocket::Connect()
{
//Disconnect if we are connected.
if (m_hComm)
{
CloseHandle(m_hComm);
}
//Lets connect to the port
char szPortName[10];
sprintf(szPortName, "\\\\.\\COM%d", m_dwComPort);
m_hComm = CreateFile(
szPortName, // Name
of port
GENERIC_READ|GENERIC_WRITE, // access ( read and write)
0, // (share) 0: cannot share
the COM port
0, // security (None)
OPEN_EXISTING, // creation : open_existing
FILE_FLAG_OVERLAPPED, // we want overlapped
operation FILE_FLAG_OVERLAPPED
0 // no templates file for
COM port...
);
// Check if we could open the port
if (m_hComm == INVALID_HANDLE_VALUE)
{
DWORD dwRes = GetLastError();
if (ERROR_ACCESS_DENIED == dwRes) WriteLog(1, "Connect
failed, Port is already open");
if (ERROR_FILE_NOT_FOUND == dwRes) WriteLog(1, "Connect
failed, The specified port do not exist");
WriteLog(1, "Connect failed, CreateFile, unspecified
error: %d", dwRes);
return dwRes;
}
//Com settings structure
DCB dcb = {0};
dcb.DCBlength = sizeof(DCB);
if (!GetCommState (m_hComm, &dcb))
{
CloseHandle(m_hComm);
DWORD dwRes = GetLastError();
WriteLog(1, "Connect failed, GetCommState, unspecified
error: %d", dwRes);
return dwRes;
}
dcb.fBinary=TRUE;
dcb.fDsrSensitivity=false;
dcb.fOutX=false;
dcb.fInX=false;
dcb.fNull=false;
dcb.fAbortOnError=TRUE;
dcb.fOutxCtsFlow=FALSE;
dcb.fOutxDsrFlow=false;
dcb.fDtrControl=DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity=false;
dcb.fRtsControl=RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow=false;
dcb.fOutxCtsFlow=false;
// custom
dcb.BaudRate = m_dwBaudRate;
dcb.ByteSize = m_bByteSize;
dcb.Parity = m_bParity;
if ( m_dwStopBits == 1 )
dcb.StopBits = ONESTOPBIT;
else if (m_dwStopBits == 2 )
dcb.StopBits = TWOSTOPBITS;
else
dcb.StopBits = ONE5STOPBITS;
//Tell the comport how it should work.
if (!SetCommState (m_hComm,&dcb))
{
CloseHandle(m_hComm);
DWORD dwRes = GetLastError();
WriteLog(1, "Connect failed, SetCommState, unspecified
error: %d", dwRes);
return dwRes;
}
// We want to Receive events.
//SetCommMask( m_hComm, EV_RXCHAR|EV_TXEMPTY);
// Set some timeouts.
COMMTIMEOUTS timeouts;
if(!GetCommTimeouts (m_hComm, &timeouts))
{
CloseHandle(m_hComm);
DWORD dwRes = GetLastError();
WriteLog(1, "Connect failed, GetCommTimeouts,
unspecified error: %d", dwRes);
return dwRes;
}
WriteLog(2, "timeouts: ReadInterval: %d, ReadTotalConstant: %d,
ReadTotalMultiplier: %d, WriteTotalConstant: %d, WriteTotalMultiplier:
%d",
timeouts.ReadIntervalTimeout,
timeouts.ReadTotalTimeoutConstant,
timeouts.ReadTotalTimeoutMultiplier,
timeouts.WriteTotalTimeoutConstant,
timeouts.WriteTotalTimeoutMultiplier
);
//defaults, I think...
//ReadInterval: 10, ReadTotalConstant: 0, ReadTotalMultiplier:
0, WriteTotalConstant: 5000, WriteTotalMultiplier: 0
timeouts.ReadIntervalTimeout = 10; // time
between chars
timeouts.ReadTotalTimeoutConstant = 0; //
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 5000;
timeouts.WriteTotalTimeoutMultiplier = 0;
if(!SetCommTimeouts (m_hComm, &timeouts))
{
CloseHandle(m_hComm);
DWORD dwRes = GetLastError();
WriteLog(1, "Connect failed, SetCommTimeouts,
unspecified error: %d", dwRes);
return dwRes;
}
//Flush the port.
//PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR |
PURGE_RXABORT | PURGE_TXABORT);
// Done with connecting, launch the thread
ResetEvent(m_hStopEvent);
ResetEvent(m_hNewDataEvent);
// start the thread
if (!m_bThreadRunning)
{
WriteLog(1, "Connect OK, Trying to start the thread");
Start();
}
else
WriteLog(1, "Connect OK, Thread is already running");
//connect
HandleConnect();
return 0;
}
unsigned __stdcall Datatal::CSerialSocket::ThreadFunc(void* pClient)
{
OVERLAPPED ovRead, ovWrite,
ovEvents;
HANDLE hEvents[5];
DWORD dwWait;
bool bCanRun = true;
DWORD dwEventMask;
bool bSending = false;
bool bReading = false;
bool bNewData = false;
bool bReadComplete = false;
char
szInBuffer[_COMLIB_WORK_SIZE_]; //Out workbuffer,
char
szOutBuffer[_COMLIB_WORK_SIZE_]; //Out workbuffer,
DWORD dwBytesRead = 0;
DWORD dwFlags = 0;
//fetch the parameters
CSerialSocket& client =
*(CSerialSocket*)pClient;
client.WriteLog(2, "ThreadFunc, Thread is running...");
// Overlapped structures.
memset(&ovRead, 0, sizeof(ovRead));
memset(&ovWrite, 0, sizeof(ovWrite));
memset(&ovEvents, 0, sizeof(ovEvents));
//Create events
ovRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ovRead.hEvent)
{
client.m_bThreadRunning = false;
client.WriteLog(1, "Failed to create ovRead event: %d",
GetLastError());
return 0;
}
ovWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ovWrite.hEvent)
{
client.m_bThreadRunning = false;
client.WriteLog(1, "Failed to create ovWrite event: %d",
GetLastError());
return 0;
}
ovEvents.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ovEvents.hEvent)
{
client.m_bThreadRunning = false;
client.WriteLog(1, "Failed to create ovEvents event:
%d", GetLastError());
return 0;
}
//Event array
hEvents[0] = client.m_hStopEvent;
hEvents[1] = ovRead.hEvent;
hEvents[2] = ovWrite.hEvent;
hEvents[3] = ovEvents.hEvent;
hEvents[4] = client.m_hNewDataEvent;
// Want to know when some new data have arrived.
dwEventMask = EV_RXCHAR;
//Tell the class that we are running know
client.m_bThreadRunning = true;
while ( bCanRun )
{
//If we are not connected, do a sleep and then continue.
Do this until we are signalled to stop.
if (!client.IsConnected() && bCanRun)
{
bSending = false;
bReading = false;
bNewData = false;
bReadComplete = false;
//Check if we should reconnect.
if (client.GetReconnect())
{
client.WriteLog(3, "Threadfunc,
Reconnect!");
client.Connect();
}
if (!client.IsConnected())
{
client.WriteLog(2, "ThreadFunc, Waiting
15 seconds or on die event..");
DWORD dwRes =
WaitForSingleObject(client.m_hStopEvent, 15000);
if (dwRes == WAIT_OBJECT_0) bCanRun
= false;
continue;
} // if (!client.IsConnected())
else
Sleep(1000);
}
// Tell us that we want to Receive data
if (bReading)
dwWait = WaitForMultipleObjects (5, hEvents,
FALSE, INFINITE);
else
dwWait = 1000; //will not be found in the
switch.
switch ( dwWait )
{
// Stop event
case WAIT_OBJECT_0:
bCanRun = false;
client.WriteLog(1, "DIE EVENT triggered.");
continue;
break;
// Overlapped Read is completed.
case WAIT_OBJECT_0 + 1:
client.WriteLog(2, "Read -> completed");
ResetEvent(ovRead.hEvent);
bReadComplete = true;
break;
// Overlapped write is completed.
case WAIT_OBJECT_0 + 2:
client.HandleSendComplete();
ResetEvent(ovWrite.hEvent);
bSending = false;
if (client.m_nOutBufSize)
bNewData = true;
else
bNewData = false;
client.WriteLog(2, "Write -> completed");
break;
// A Send() have been done.
case WAIT_OBJECT_0 + 4:
client.WriteLog(1, "send -> triggered");
ResetEvent(client.m_hNewDataEvent);
bNewData = true;
break;
// Received new data
case WAIT_OBJECT_0 + 3:
client.WriteLog(1, "read -> event");
ResetEvent(ovEvents.hEvent); //reset it before.
break;
case 1000:
break;
default:
client.WriteLog(1, "ThreadFunc, Incorrect dwRes:
%d, error: %d\n", dwWait, GetLastError());
break;
} //switch
//dwBytesRead = 0;
if (!bReading)
{
bReading = true;
bReadComplete = false;
memset(szInBuffer, 0, _COMLIB_WORK_SIZE_);
//_COMLIB_WORK_SIZE_
client.WriteLog(3, "read -> ReadFile, event:
%d", ovRead.hEvent);
if (!ReadFile(client.m_hComm, szInBuffer, 1,
&dwBytesRead, &ovRead))
{
int nErr = GetLastError();
if (nErr != ERROR_IO_PENDING)
{
client.WriteLog(1, "ReadFile
failed! Error %d.\n", GetLastError());
client.Disconnect();
client.HandleDisconnect();
continue;
}
client.WriteLog(3, "Read -> Pending read
inited", dwBytesRead);
}
else
{
client.WriteLog(3, "Read -> completed
directly, %d bytes", dwBytesRead);
if (dwBytesRead == 0)
{
bReadComplete = false;
bReading = false;
client.WriteLog(3, "Read ->
Nothing read, hotfix, do a read again.");
}
else
{
bReadComplete = true;
bReading = false;
}
}
}
if (bReadComplete)
{
//If a read was not completed directly,
dwReadBytes = 0, fetch overlapped result.
if (dwBytesRead == 0)
{
dwFlags = 0;
if(!GetOverlappedResult(client.m_hComm,
&ovRead, &dwBytesRead, false))
{
client.WriteLog(1,
"GetOverlappedResult() failed on Read! Bytes read is %d. Error %d.\n",
dwBytesRead, GetLastError());
client.Disconnect();
client.HandleDisconnect();
continue;
}
}
//Closed?
if ( dwBytesRead == 0)
{
client.WriteLog(1, "Socket closed by
Host when waiting for Read..\n");
client.Disconnect();
client.HandleDisconnect();
continue;
}
client.m_critRead.Lock();
if (client.m_nInBufSize + dwBytesRead >
_COMLIB_IN_SIZE_)
{
client.m_critRead.Unlock();
client.WriteLog(1, "Read -> BUFFER
OVERFLOW, disconnecting");
client.Disconnect();
continue;
}
//Copy Received data to our inbuffer
memcpy(client.m_pInBuf + client.m_nInBufSize,
szInBuffer, dwBytesRead);
client.m_nInBufSize += dwBytesRead;
client.WriteLog(3, "Read -> Data: %s, bytes:
%d", szInBuffer, dwBytesRead);
//Tell derived class that new data is in the
buffer
//More than one packet can be in the same
buffer, so handle it.
int nBytesOk;
nBytesOk = client.HandleReceive(client.m_pInBuf,
client.m_nInBufSize);
client.WriteLog(3, "Read -> Bytes handled: %d",
nBytesOk);
//Check if there are more data to trigger on.
int nByteCount = nBytesOk;
while (nBytesOk && (nByteCount <
client.m_nInBufSize))
{
nBytesOk =
client.HandleReceive(client.m_pInBuf + nByteCount, client.m_nInBufSize -
nByteCount);
client.WriteLog(3, "Read -> Bytes
handled2: %d", nBytesOk);
nByteCount += nBytesOk;
}
//derived class should return the number of
bytes that were accepted
//remove those bytes from the buffer
if (nByteCount > 0)
{
//WHole buffer?
if (nByteCount == client.m_nInBufSize)
{
client.WriteLog(3, "Read ->
Cleahing whole buffer");
memset(client.m_pInBuf, 0,
_COMLIB_IN_SIZE_);
client.m_nInBufSize = 0;
}
else
{
client.WriteLog(3, "Read ->
Cleaing partial buffer");
memmove(client.m_pInBuf,
client.m_pInBuf + nByteCount, client.m_nInBufSize - nByteCount);
client.m_nInBufSize -=
nByteCount;
} //if (nBytesOk == *pTP->pnInBufSize)
} //if (nBytesOk > 0)
memset(szInBuffer, 0, _COMLIB_WORK_SIZE_);
bReadComplete = false;
bReading = false;
client.m_critRead.Unlock();
}
//We gotto write some stuff, and we only do it if no
operations are ongoing
if (bNewData && !bSending)
{
//Lock buffer and fetch data
client.m_critWrite.Lock();
ResetEvent(client.m_hNewDataEvent);
bSending = true;
int nBufferLen = 0;
//TODO: large for our workbuffer?
if (client.m_nOutBufSize > _COMLIB_WORK_SIZE_)
{
memcpy(szOutBuffer, client.m_pOutBuf,
_COMLIB_WORK_SIZE_); // fill the buffer
memmove(client.m_pOutBuf,
client.m_pOutBuf + _COMLIB_WORK_SIZE_, client.m_nOutBufSize -
_COMLIB_WORK_SIZE_);
memset(client.m_pOutBuf +
_COMLIB_OUT_SIZE_ - _COMLIB_WORK_SIZE_, 0, _COMLIB_OUT_SIZE_ -
_COMLIB_WORK_SIZE_);
nBufferLen = _COMLIB_WORK_SIZE_;
client.m_nOutBufSize -=
_COMLIB_WORK_SIZE_;
}
else
{
memcpy(szOutBuffer, client.m_pOutBuf,
client.m_nOutBufSize);
memset(client.m_pOutBuf, 0,
_COMLIB_OUT_SIZE_);
nBufferLen = client.m_nOutBufSize;
client.m_nOutBufSize = 0;
}
DWORD dwBytesWritten;
if (!WriteFile(client.m_hComm, szOutBuffer,
nBufferLen, &dwBytesWritten, &ovWrite))
{
//Overlapped?
if (GetLastError() != ERROR_IO_PENDING)
{
client.m_critWrite.Unlock();
client.WriteLog(3, "WriteFile()
failed! Error %d", GetLastError());
client.Disconnect();
client.HandleDisconnect();
break;
}
bSending = true; //only set pending
write if we do not complete directly.
}
else
bSending = false;
client.m_critWrite.Unlock();
} //if (!bSending && !bReading)
} //while
client.m_bThreadRunning = false;
return 0;
}
|
|
|
|
|
WiB wrote:
You didn't answer my questions:
1. Do you connect 2 PC via COM?
2. Did you check settings of both COM?
1. On one server i communicate with the same PC (both ports are on a digibort)
On the other (nonworking) server i communicate with a PABX.
2. Yes. The only diffrence is the type of comports. On the nonworking server it's USB serial port, and on the working server it's DigiBord comports.
Well.. Can you please check the connect function, Im not sure if the DCB and Timeoutsettings are correct.
|
|
|
|
|
can you check my Connect function anyway?
Since hyperterminal can recieve data from the port, it must be something with my program. And Im really desperate to find out what.
|
|
|
|
|
hii,
for any call of this function EnumDisplayDevices(..) , It generate error when compilation , "undeclared identifier" without any acceptable reason !!
any one can help of that ,
- I made all needed includes ! ,
hatem
|
|
|
|
|
thank u ,
but I do so , but nothing changed !! , still "undeclared identifier" !!!
I really don't know why !!!
hatem
|
|
|
|
|
there is ,
in customize ..
user32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/test005.pdb" /debug /machine:I386 /out:"Debug/test005.exe" /pdbtype:sept
|
|
|
|
|
#include <multimon.h>
In one (and only one) file that includes this file, include this line before the #include line:
#define COMPILE_MULTIMON_STUBS
This will enable the use of the multi-monitor functions on any platform (even though Win95 does not support multiple monitors) and degrade gracefully if they are not supported.
Ryan
Being little and getting pushed around by big guys all my life I guess I compensate by pushing electrons and holes around. What a bully I am, but I do enjoy making subatomic particles hop at my bidding - Roger Wright (2nd April 2003, The Lounge)
Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late - John Nichol "Point Of Impact"
|
|
|
|
|