Графическое клиент-серверное приложение на примере интерполяции. Кусочно-линейная интерполяция, страница 5

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() должна иметь возможность не читать данные из файла, а посылать отдельную точку. Также сервер должен хранить последнюю точку из предыдущей интерполяции.