Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Распараллеливание. Потоки.


Автор: eon 21.10.2010, 08:52
Есть функция:
Код

private void ExecuteProgram(string filename)
        {
            blablabla
        }
    

Есть событие, по которому вызывается вышеописанная функция:
Код

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            filename = alalalala...
            ExecuteProgram(filename);
        }

    

Всё отлично работает.
Хочу включить выполнение этой функции в поток.
Пытаюсь так:
Код

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            filename = alalalala...
            Thread th = new Thread(ExecuteProgram(filename));
            th.Start();
        }

    
Ошибки:
Error 1 The best overloaded method match for 'System.Threading.Thread.Thread(System.Threading.ThreadStart)' has some invalid arguments
Error 2 Argument '1': cannot convert from 'void' to 'System.Threading.ThreadStart'

До этого переделал функцию, сделал ее без входящих данных, всё работает, но:
Вопрос: как впихнуть функцию с входящими данными в поток?
Спасибо.

Автор: diadiavova 21.10.2010, 09:22
Код

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            filename = alalalala...
            Thread th = new Thread(ExecuteProgram);
            th.Start();
        }


Автор: azesmcar 21.10.2010, 09:38
Код

ThreadPool.QueueUserWorkItem((o) => this.ExecuteProgram("filename"));


Автор: eon 21.10.2010, 09:40
Цитата(diadiavova @ 21.10.2010,  09:22)
Код

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            filename = alalalala...
            Thread th = new Thread(ExecuteProgram);
            th.Start();
        }


Если написать:

private void ExecuteProgram(string filename)

А поток:

Thread th = new Thread(ExecuteProgram);

то:

Error    1    The best overloaded method match for 'System.Threading.Thread.Thread(System.Threading.ThreadStart)' has some invalid arguments
Error    2    Argument '1': cannot convert from 'method group' to 'System.Threading.ThreadStart'

Добавлено через 8 минут и 59 секунд
Цитата(azesmcar @ 21.10.2010,  09:38)
Код

ThreadPool.QueueUserWorkItem((o) => this.ExecuteProgram("filename"));

Спасибо. То, что надо вроде.

Автор: eon 21.10.2010, 10:02
Thread t = new Thread(delegate(){ ExecuteProgram(filename); });

так тоже работает

Автор: azesmcar 21.10.2010, 10:03
Цитата(eon @  21.10.2010,  10:02 Найти цитируемый пост)
Thread t = new Thread(delegate(){ ExecuteProgram(filename); });

так тоже работает 

Не стоит создавать потоки нарпямую, использую thread pool. Так намного эффективнее.

Автор: eon 21.10.2010, 10:06
Цитата(azesmcar @ 21.10.2010,  10:03)
Цитата(eon @  21.10.2010,  10:02 Найти цитируемый пост)
Thread t = new Thread(delegate(){ ExecuteProgram(filename); });

так тоже работает 

Не стоит создавать потоки нарпямую, использую thread pool. Так намного эффективнее.

Спасибо за совет, я конечно маловато пока в этом осознал, но всё же - спасибо.

Автор: azesmcar 21.10.2010, 10:13
Цитата(eon @  21.10.2010,  10:06 Найти цитируемый пост)
Спасибо за совет, я конечно маловато пока в этом осознал, но всё же - спасибо. 


Цитата(eon @  21.10.2010,  10:02 Найти цитируемый пост)
Thread t = new Thread(delegate(){ ExecuteProgram(filename); });

создает поток и запускает твою функцию, функция завершается, поток больше не нужен и удаляется.

Цитата(azesmcar @  21.10.2010,  09:38 Найти цитируемый пост)
ThreadPool.QueueUserWorkItem((o) => this.ExecuteProgram("filename"));

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

Автор: diadiavova 21.10.2010, 10:20
Цитата(eon @  21.10.2010,  10:40 Найти цитируемый пост)
Если написать:

private void ExecuteProgram(string filename)

А поток:

Thread th = new Thread(ExecuteProgram);

Извиняюсь, я имел в виду
Код

        private void ExecuteProgram(object filename)
        {
            //code
        }

    private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            var filename = "";
            var th = new Thread(ExecuteProgram);
            th.Start(filename);
        }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)