Цитата
В Си ошибок только прибавится. Причем, на порядок.
Программу хотят еще и на КПК перенести для работы в полевых условиях. Это одна из причин перехода на Си.
Цитата
А всего делов - запихивать данные из УАРТа в кольцевой буфер. А рисующий поток из этого кольцевого буфера изымает по мере возможности. И никто не страдает.
Надо было мне сразу кусочек кода дать.
Вот как у меня сейчас сделано:
Поток приема из УАРТа.
Код
data := buf;
SetEvent(Event_new_data);
В переменной buf (dword) содержится данные из УАРТа, которые мы копируем в промежуточный буфер.
Поток обработки информации.
Код
WaitForSingleObject(MainForm.Event_new_data, INFINITE);
ResetEvent(MainForm.Event_new_k);
Array_data[counter] := MainForm.data;
inc(counter);
SetLength(Array_data, counter + 1);
// далее сама обработка
Ждем новых данных, запихиваем их в массив и выделяем новую ячейку под следующие данные.
Массив не кольцевой по причине того, что для данной версии программы нужно хранить всю накопленные данные в памяти. Но это тестовый вариант, поэтому для конечного варианта программы будет сделано что-то типа буфера FIFO.
Вообще, предположение о потере пакетов это лишь догадка... Просто когда я отключаю рисование графики, то программа работает стабильно.
Цитата
В Borland C++ Builder есть TChart.
Был бы Билдер для КПК - не знал бы я проблем.
Цитата
Еще вариант видел: в дополнительном потоке идет работа с com-портом, а приложению постится (WM_USER + x) сообщение с принятыми данными (при этом выделялась память, передавался указатель на буфер с данными; обработчик сообщения данные обрабатывал и память обязательно освобождал).
Попробую разобраться с сообщениями в Windows.
Цитата
Стандартный драйвер Windows умеет организовывать софтверные буферы большого объема на отправку\прием. Этого обычно хвататет чтобы ничего не терять.
Забыл вчера написать, что чаще всего виснет сама графика, а обработка данных происходит нормально. Рисование происходит простым добавлением новой точки, например, MainForm.Series1.AddY(high_border[i]). И зависнуть это дело может как на 10 точке добавление, так и на 10000.