Вариант с PostMessage оказался самым удобным и теперь код выглядит так:
Некоторый поток:
1. входим в критическую секцию
2. меняем данное (в базе)
3. покидаем критическую секцию
4. PostMessage( hMainWnd, WM_USER+1, DataId, 0);
Оконная процедура:
1. входим в критическую секцию
2. получаем данное (по идентификатору)
3. покидаем критическую секцию
4. записываем текст в ячейку
но ошибка не устранена. кажется, какая-то фигня с критическими секциями.
если приостановить программу, то поток останавливается в этом месте:
mlock.c -> void __cdecl _lock(int locknum)
при этом компилятор (VS2010) показывает сообщение "Процесс деактивирован. Все потоки завершены"
D>PS: Один из самых простых способов — PostMessage
D> Обновляющий поток (псевдо-код):
D> 1. получаем портянку данных
D> 2. входим в критическую секцию
D> 3. кладем данные в хранилище
D> 4. PostMessage(HandleГлавногоОкна, WM_USER + 1, 0, 0);
D> 5. выходим из критической секции
D> UI-поток (основное окно)
D> 1. ловим WM_USER + 1
D> 2. входим в критическую секцию
D> 3. обновляем
D> 4. выходим из критической секции