Я делаю проект на FileTransfer, в котором у меня есть список, я получу события из одного из моих файлов класса для обновления процента отправленного файла, после его получения я помещу процент в свой список, пока выполняю что у listview появился эффект мерцания, как этого избежать. Я использовал application.doevents (), но он не работает. Я видел в торрентах при обновлении процентов, что список не мерцает, как этого добиться.

void Sender_Progress(int CurrentValue, string Ip) // here im receiving Events
    {
        try
        {
            //if (CurrentValue == 1)
            //    UpdateTimer.Enabled = true;
            //list_send.Items[CurrentValue].SubItems[4].Text = Ip.ToString();
            //Application.DoEvents();
            obj = new object[] {CurrentValue,   Ip };
            list_send.Invoke(new UpdateList(UpList), obj);

        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    public void UpList(int Val, string ind) // here im updating the listview
    {
        Application.DoEvents();
        int index = 0;
        index = Convert.ToInt32(ind);
        index = index - 1;
        list_send.Items[index].SubItems[4].Text = Val.ToString();
        if (Val == 100)
        {
            list_send.Items[index].SubItems[2].Text = "Completed.";
            //UpdateTimer.Enabled = false;
        }
        //Application.DoEvents();
    }
c#
1
karthik 3 Окт 2009 в 10:27
2
Может быть, если бы вы могли показать нам код, который вы написали до сих пор?
 – 
Mitch Wheat
3 Окт 2009 в 10:28

3 ответа

Лучший ответ

Я успешно преодолеваю эффект мерцания, я часто получаю события, я буду получать целое число каждый раз, я буду хранить его в переменной и сравнивать его со следующей переменной, полученной событием, если оно совпадает, я не буду вызывать просмотр списка, иначе я вызову его .Теперь мерцание уходит. Спасибо всем.

-1
karthik 6 Окт 2009 в 10:32

Во-первых, вам не нужен DoEvents, поскольку вы уже правильно работаете с двумя потоками. Удалите это. После этого, я полагаю, проблема в том, что все происходит слишком быстро. Можно ли пакетировать обновления и отправлять обновления, скажем, каждые 20? 50? раз? Непонятно, что это за элемент управления, но у многих есть режимы множественного обновления; например, с ListView:

    theList.BeginUpdate();
    try {
        // make multiple updates here...
    } finally {
        theList.EndUpdate();
    }

Затем я бы просил передать список обновлений, скажем, каждые 20 раз (если каждое из них не требует значительного времени) [обратите внимание, что это должен быть другой список для каждого Invoke, и вам нужно не забудьте также отправить оставшиеся элементы в конце].

2
Marc Gravell 3 Окт 2009 в 11:08

Используйте рабочий поток - он доступен из панели инструментов и имеет два события, которые вызываются в основном (UI) потоке.

Событие Progress может использоваться, чтобы сигнализировать списку о том, что его нужно обновить или что задача завершена.

0
Dror Helper 3 Окт 2009 в 11:08