Подвисание программы на непонятной ошибке
От: Grosheva Anna Россия  
Дата: 02.03.05 18:50
Оценка:
Ситуация следующая.
Имеется программа, которой по "сети" приходят команды от сервера. Сеть эмулирует класс, назовем его gs (globalSettings). Основной класс программы (mainPDA) по таймеру забирает из gs список команд и обрабатывает их. В процессе обработки могут открываться новые формы.
и вот тут начинаются чудеса.При вызове функций из классов форм внутри этих функций эмулятор ПДА как бы подвисает.
т.е код такого вида
public bool UpdateDishListView()
{
try
{
ListViewItem ii = new ListViewItem("asdfg");
ii.SubItems.Add("1111");
ii.SubItems.Add("1111");
listViewDishList.Items.Add(ii);
return true;
}
catch
{
return false;
}
finally
{
int i=0;
if (i==0) i++;
}

На строке listViewDishList.Items.Add(ii) система подвисает. До строки return оно не доходит. Происходит выход из окна VisualStudio (в режиме отладки) , он делает вид что передал управление в эмулятор. Окно эмулятора не обновляется. И помогает выйти из всего этого безобразия ресет эмулятора.
В блоки catch и finally программа не попадает. Т.е если и возникает ошибка , то непонятно какая.
Эмулятор Pocked PC 2003 Emulator

Может кто сталкивался с похожей проблемой? В чем тут может быть дело?
Re: Подвисание программы на непонятной ошибке
От: hima Украина  
Дата: 03.03.05 10:58
Оценка:
Здравствуйте, Grosheva Anna, Вы писали:

GA>Ситуация следующая.

GA>Имеется программа, которой по "сети" приходят команды от сервера. Сеть эмулирует класс, назовем его gs (globalSettings). Основной класс программы (mainPDA) по таймеру забирает из gs список команд и обрабатывает их. В процессе обработки могут открываться новые формы.
GA>и вот тут начинаются чудеса.При вызове функций из классов форм внутри этих функций эмулятор ПДА как бы подвисает.
Насколько я понял, ты пытаешся заапдейтить интерфейс из другого потока. GUI должен обновлятся только из соответсвующего GUI потока. Используй Control.Invoke().
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[2]: Подвисание программы на непонятной ошибке
От: Grosheva Anna Россия  
Дата: 03.03.05 16:23
Оценка:
Здравствуйте, hima, Вы писали:

H>Насколько я понял, ты пытаешся заапдейтить интерфейс из другого потока. GUI должен обновлятся только из соответсвующего GUI потока. Используй Control.Invoke().


void TimerMethod(Object state)
{
//timer.Change(Timeout.Infinite, Timeout.Infinite);
ArrayList arr = new ArrayList();
gs.GetCmdList(arr);
ProcessCmds(arr);
}
Это колбэк таймера. В ProcessCmds могут вызываться куча разных методов с разных форм. Как бы Control.Invoke() проблематично использовать на мой взляд.

PS:за ответ спасибо, хотя бы знаю в каком направлении искать.
Re[3]: Подвисание программы на непонятной ошибке
От: Grosheva Anna Россия  
Дата: 03.03.05 17:16
Оценка:
GA> Это колбэк таймера. В ProcessCmds могут вызываться куча разных методов с разных форм. Как бы Control.Invoke() проблематично использовать на мой взляд.

Ошиблась малость. У меня класс,в котором таймер находится, не наследуется от визуальных компонентов. Поэтому Invoke не помогает.
Re[4]: Подвисание программы на непонятной ошибке
От: hima Украина  
Дата: 04.03.05 09:48
Оценка:
Здравствуйте, Grosheva Anna, Вы писали:

GA>Ошиблась малость. У меня класс,в котором таймер находится, не наследуется от визуальных компонентов. Поэтому Invoke не помогает.

Ты просто не для того вызываешь. Нужно вызывать Invoke() того контрола, который должен обновляться.

public class Manager {
    public MyForm frmMy {
        get {
            return this.p_frmMy;
        }
        set {
            this.p_frmMy = value;
        }
    }
    private MyForm p_frmMy;
    
    ....
    
    public ProcessCmds() {
        ...
        this.frmMy.Invoke(this.frmMy.dlgAction);
        ...
    }
}


За синтаксис не ручаюсь — писал прямо в сообщении, а смысл такой.

По предыдущему посту:
>Это колбэк таймера. В ProcessCmds могут вызываться куча разных методов с разных форм.
А зачем апдейтить интерфейс нескольких форм, если работаем всё равно с одной. Не проще апдейтить данные для интерфейса, а на OnActivated() каждой формы уже браться за интерфейс?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.