CMonitorStatus
Maheshwar Gundelly -- gundelly@enuxsa.eas.asu.edu
Monday, April 15, 1996
Hi,
Environment : Windows NT 3.51 and 4.0 Beta / VC++ 4.0
Error displayed is :
Microsoft Visual C++ Debug Library
Debug Assertion Failure
Program : u:\gundelly\project\debug\project.exe
File : afxwin.inl
Line : 126
This problem is occuring when I include Invalidate() in the Start_Monitor1()
function of CMonitorStatus class.
Please give me suggestions as how to solve this problem with threads.
Thank you
Here is the code :
UINT MyThreadProc( LPVOID pParam )
{
SOCKET new_sock;
SOCKADDR_IN server_addr;
char server_mesg[1000];
char temp[80];
int ret;
CMonitorStatus m_sts;
int server_addr_len = sizeof( server_addr );
new_sock = accept( sock, (struct sockaddr FAR *) &server_addr, (
int FAR *) &server_addr_len );
if ( new_sock < 0 )
{
::MessageBox(NULL, "Error in Accept", "INFO", MB_OK);
return 0;
}
ret = recv( new_sock, server_mesg, 1000, 0);
sscanf(server_mesg, "%d %d", &server_port, &reporting_port);
sprintf(temp, "Server : %d Report %d ", server_port, reporting_port);
closesocket(sock);
closesocket(new_sock);
m_sts.Start_Monitor1();
return 1;
}
// CProjectView derived from CFormView class
void CProjectView::OnStartServer()
{
// TODO: Add your control notification handler code here
char szcommand[200];
char wtemp[30];
BOOL ret;
STARTUPINFO startup;
PROCESS_INFORMATION proc_info;
WORD wVersionRequested;
WSADATA wsaData;
SOCKADDR_IN report_addr, tmp_addr;
char szHost_Name[40];
int tmp_len;
int err;
void (CProjectView::*fun_p)() = 0;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup( wVersionRequested, &wsaData);
if ( err != 0 )
{
MessageBox(" WsaStartup Error", "Error", MB_OK);
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE ( wsaData.wVersion ) != 1 )
{
WSACleanup();
return;
}
sock = socket( AF_INET, SOCK_STREAM, 0);
if ( sock == INVALID_SOCKET )
{
MessageBox(" Invalid Socket", "S Error", MB_OK);
return;
}
memset( (char *)&report_addr, NULL, sizeof(SOCKADDR_IN) );
report_addr.sin_family = AF_INET;
report_addr.sin_addr.s_addr = INADDR_ANY;
report_addr.sin_port = htons(0);
ret = bind( sock, (struct sockaddr FAR *) &report_addr, sizeof(
report_addr) );
if ( ret == SOCKET_ERROR )
{
MessageBox("Error in binding report address", "Error", MB_OK);
return;
}
ret = listen( sock, 5);
if ( ret < 0 )
MessageBox("Listen Error", "Error", MB_OK);
startup.cb = sizeof ( STARTUPINFO);
startup.lpReserved = NULL;
startup.lpDesktop = NULL;
startup.lpTitle = "Manager";
startup.dwX = 100;
startup.dwY = 100;
startup.dwXSize = 100;
startup.dwYSize = 100;
startup.dwFlags = 0;
startup.dwFlags = STARTF_USESIZE | STARTF_USEPOSITION;
startup.cbReserved2 = 0;
startup.lpReserved2 = NULL;
memset(szcommand, NULL, 200);
CProjectDoc* pDoc = GetDocument();
UpdateData(TRUE);
pDoc->m_server.set_prog_name(m_Program_Name);
pDoc->m_server.set_port_number(m_Port_Number);
buf_ptr = m_Program_Name.GetBuffer(40);
strcpy(szcommand, buf_ptr);
//MessageBox(buf_ptr, "buf value", MB_OK);
gethostname(szHost_Name, sizeof(szHost_Name));
tmp_len = sizeof( tmp_addr);
if ( getsockname(sock, ( struct sockaddr FAR *) &tmp_addr,
( int FAR *) &tmp_len) == SOCKET_ERROR )
{
MessageBox("Error Retrieving the port number",
"getsockname",MB_OK) ;
return;
}
strcat( szcommand, " -calypso-verbose -calypso-report ");
strcat(szcommand , szHost_Name);
strcat(szcommand, " ");
tmp_len = strlen(szcommand);
port_number = ntohs(tmp_addr.sin_port);
sprintf(szcommand + tmp_len -1," %d", port_number );
ret = CreateProcess( NULL, szcommand, NULL, NULL, TRUE, CREATE_NEW_CONSOLE,
NULL, NULL, &startup, &proc_info );
if (!ret )
{
sprintf(wtemp," Check the input. Error return is %d
errorno %d", ret, errno);
MessageBox(wtemp, "Error " , MB_OK);
return;
}
first = NULL; // pointer to first element in the list of worker processes
CProjectView *pNewObject;
pNewObject = new CProjectView;
AfxBeginThread(MyThreadProc, pNewObject);
CButton *pButton = (CButton *) GetDlgItem(IDC_START_SERVER);
pButton->EnableWindow(FALSE);
}
void CMonitorStatus::Start_Monitor1()
{
SOCKET msock;
SOCKADDR_IN dest_addr;
char szHost_Name[40];
PHOSTENT phe;
char result[1000], *str;
int ret;
int len, i=0, j = 0, k = 0, index = 0, flag, step_number;
msock = socket( AF_INET, SOCK_STREAM, 0);
if ( msock == INVALID_SOCKET )
{
MessageBox(" Invalid Socket", "Socket Error", MB_OK);
return;
}
memset( (char *)&dest_addr, NULL, sizeof(SOCKADDR_IN) );
gethostname(szHost_Name, sizeof(szHost_Name));
phe = gethostbyname(szHost_Name);
if ( phe == NULL )
{
MessageBox("gethostbyname failure", "Error", MB_OK);
return;
}
dest_addr.sin_family = AF_INET;
memcpy((char FAR *)&(dest_addr.sin_addr), phe->h_addr, phe->h_length);
dest_addr.sin_port = htons(reporting_port);
if ( connect(msock, (PSOCKADDR)&dest_addr, sizeof(dest_addr)) < 0 )
{
MessageBox("Connect failure", "Error", MB_OK);
return;
}
FILE *fp;
fp = fopen("u:\\gundelly\\out.txt", "w");
if ( fp == NULL )
MessageBox("Error Opening file", "Err", MB_OK);
else
{
while ( 1 )
{
memset( result, NULL, sizeof( result));
/* ********************
this statement gives error. With out this appl works ok expect
no redrawing takes place.
****************************/
Invalidate();
/*****************/
ret = recv(msock, (char *)&len, sizeof(int), 0);
ret = recv(msock, (char FAR *) result, len, 0);
if ( ret > 0 )
{
str = result;
start_of_data = 1;
if ( *str != '\0' )
{
sscanf(result, "%d", &step_number);
flag = 0;
if ( i != 0 )
{
for ( k = 0; k < i ; k++ )
{
if( monitor_data[k].step_number == step_number )
{
flag = 1;
break;
}
}
}
if ( i == 0 )
{
index = 0;
i++;
}
else if ( flag )
{
index = k;
flag = 0;
}
else if ( !flag )
{
index = i;
i++;
}
monitor_data[index].step_number = step_number;
while ( *str++ != ' ');
j = 0;
while ( *str != '\0' )
{
if ( *str != ' ' && *str != '\n' )
{
monitor_data[index].status[j] = *str;
j++;
}
str++;
}
monitor_data[index].number_of_steps = j;
total_steps = i ;
} // if str != NULL
} // if ( ret > 0 )
else
end_of_data = 1;
fprintf(fp, " %d %s",len, result);
if ( ret == 0 || ret == SOCKET_ERROR)
{
MessageBox( "recv done", "Done", MB_OK);
break;
}
} // end of while true
} // end of file open
fclose(fp);
}
void CMonitorStatus::OnDraw(CDC* pDC)
{
/* Code for drawing */
}
Mahesh
Maheshwar Gundelly Phone # : 602-894-6151
950 South Terrace Road Email : gundelly@enuxsa.eas.asu.edu
#C343
Tempe Arizona - 85281.
Frederic Steppe -- FredericS@msn.com
Friday, April 19, 1996
>Environment : Windows NT 3.51 and 4.0 Beta / VC++ 4.0
>This problem is occuring when I include Invalidate() in the Start_Monitor1()
>function of CMonitorStatus class.
> CMonitorStatus m_sts;
> m_sts.Start_Monitor1();
>void CMonitorStatus::Start_Monitor1()
>{
> /* ********************
> this statement gives error. With out this appl works ok expect
> no redrawing takes place.
> ****************************/
> Invalidate();
> /*****************/
As far as I can see, you never create the windows associated with your
CMonitorStatus instance. Remember that the constructor doesn't create the
window, just the object. Invalidate() is checking that your m_hWnd member is
a valid window handle, what it isn't, so you get an assertion.
Just call the m_sts.Create(...) and anything should be OK.
Frederic Steppe (frederics@msn.com)
Mahesh
Maheshwar Gundelly Phone # : 602-894-6151
950 South Terrace Road Email : gundelly@enuxsa.eas.asu.edu
#C343
Tempe Arizona - 85281.
| Вернуться в корень Архива
|