if( !strcmp( combo_text, "Local") ){
// Локальныйканал
if ((fd = name_open(ATTACH_POINT, 0)) == -1) {
return 2;
}
}else{
// Глобальныйканал
if ((fd = name_open(ATTACH_POINT, NAME_FLAG_ATTACH_GLOBAL)) == -1) {
fclose( p );
return 2;
}
}
// Формирование заголовка сообщения
msg.hdr.type = 0x00;
msg.hdr.subtype = 0x00;
// Чтение данных из файла
fscanf( p, "%d %d %d", &msg.len, &msg.maxX, &msg.maxY );
PtGetResource( ABW_TextStep, Pt_ARG_TEXT_STRING,&str_step, 0 );
msg.h = atof( str_step );
// Проверка на допустимое значение шага
if( msg.h <= 0 && msg.h > 10 ){
fclose( p );
name_close( fd );
return 3;
}
// Чтениеточекдляинтерполяции
for( i=0; i<msg.len; i++ )
fscanf( p, "%lf %lf", &msg.dataX[i], &msg.dataY[i] );
// Отправкасообщения
MsgSend(fd, &msg, sizeof(msg), &msg_reply, sizeof(msg_reply) );
name_close( fd );
fclose( p );
return 0;
}
5. Timeline
Рис.5.1.Временная характеристика одного запроса
Как видим на рис.5.1. полный цикл интерполяции происходит за 4.5мс. Вначале клиента спит, что показывается фиолетовым цветом. Затем клиент вызывает функцию name_open() для открытия канала. После чего открывает файл, читает данные из него и передаёт сообщение серверу, и после этого переходит в режим ожидания ответа, который показан на рисунке синим цветом. А в это время сервер обрабатывает запрос и отвечает клиенту, в этот момент клиент выходит из режима ожидания, т.е. на рисунке у клиента начинается зелёная полоса. После этого клиента закрывает канал, при закрытии отправляется пульс с кодом _PULSE_CODE_DISCONNECT клиенту. Все эти события приведены ниже в файле сформированном утилитой tracelogger.
Tracelogger ( draw )
t:0xb4eaaac4 CPU:00 THREAD :THREADY pid:2318376 tid:1
t:0xb4ebd3a0 CPU:00 THREAD :THRUNNING pid:2318376 tid:1
t:0xb4ebdcc8 CPU:00 COMM :REC_PULSE scoid:0x40000003 pid:2318376
t:0xb4ec3730 CPU:00 THREAD :THREPLY pid:2318376 tid:1
t:0xb4ecbd48 CPU:00 COMM :REPLY_MESSAGE tid:1 pid:2318376
t:0xb4ecbfe8 CPU:00 THREAD :THREADY pid:2318376 tid:1
t:0xb4f35d58 CPU:00 THREAD :THRUNNING pid:2318376 tid:1
t:0xb4f39f68 CPU:00 THREAD :THRECEIVE pid:2318376 tid:1
t:0xc382780c CPU:00 KER_CALL:CONNECT_ATTACH/39 nd:0x00000000 pid:2318376
t:0xc4029248 CPU:00 COMM :SND_MESSAGE rcvid:0x00000003 pid:2318376
t:0xc402b338 CPU:00 THREAD :THRUNNING pid:2318376 tid:1
t:0xc402ba38 CPU:00 COMM :REC_MESSAGE rcvid:0x00000003 pid:2318376
t:0xc4036bb8 CPU:00 THREAD :THREPLY pid:2318376 tid:1
t:0xc404cd74 CPU:00 COMM :REPLY_MESSAGE tid:1 pid:2318376
...
t:0xc51bfbfc CPU:00 THREAD :THREPLY pid:2318376 tid:1
t:0xc51c8094 CPU:00 COMM :REPLY_MESSAGE tid:1 pid:2318376
t:0xc51c82c0 CPU:00 THREAD :THREADY pid:2318376 tid:1
t:0xc520e1f0 CPU:00 THREAD :THRUNNING pid:2318376 tid:1
t:0xc52178bc CPU:00 THREAD :THREPLY pid:2318376 tid:1
t:0xc521fe00 CPU:00 COMM :REPLY_MESSAGE tid:1 pid:2318376
t:0xc5220030 CPU:00 THREAD :THREADY pid:2318376 tid:1
t:0xc52658fc CPU:00 THREAD :THRUNNING pid:2318376 tid:1
t:0xc526b348 CPU:00 THREAD :THRECEIVE pid:2318376 tid:1
t:0xc526e89c CPU:00 COMM :SND_PULSE_DIS scoid:0x40000003 pid:2318376
Выводы.
Для интерполяции данных, программа draw читает данные из файла и передаёт их серверу. После чего сервер интерполирует их и передаёт значения клиенту. При этом сервер интерполирует только целый пакет данных и не может произвести интерполяцию, если ему с сообщением добавить следующую точку. Для того, чтобы можно было это сделать, нужно сделать постоянное соединения с сервером, а не отсоединяться от него после получения ответа на сообщение. При том, функция net_send() должна иметь возможность не читать данные из файла, а посылать отдельную точку. Также сервер должен хранить последнюю точку из предыдущей интерполяции.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.