Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бесконечный поток 
V
    Опции темы
Ryan5
Дата 5.4.2008, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Код

public void Initialize()
        {
            Thread SchemeThread = new Thread(SchemeStart);
            SchemeThread.Start();
        }
        private void SchemeStart()
        {
            Form1 G = new Form1();
            G.Show();
            
        }


После того как форма G появилась, поток завершает работу (закрывается форма и приложение), так как делать больше нечего. Как этот поток SchemeThread сделать незавершающимся, то есть чтобы форма появилась и осталась на экране, могла реагировать на всё?????
Вот как например это сделано в Application.Run(); Запустилось приложение и висит в памяти, хотя ничего не делает.
PM MAIL   Вверх
marcusmae
Дата 5.4.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Ryan5 @  5.4.2008,  23:15 Найти цитируемый пост)
Запустилось приложение и висит в памяти, хотя ничего не делает.


Ну, на самом деле делает. Как и любое оконное приложение, ожидает действий пользователя, например, опрашивая устройства ввода, или реагирует на события, например, необходимость перерисовки. Это - стандартная очередь сообщений, message loop. Если Вы хотите, чтобы поток дожидался закрытия формы и/или получения какого-то возвращаемого значения от неё, сделайте ShowDialog() вместо Show().


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
marcusmae
Дата 5.4.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Пример :

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsApplication2
{
    public partial class Form1 : Form
    {
        private static bool threadFormCreated = false;

        public Form1()
        {
            InitializeComponent();

            this.Text = "Parent Form";

            Thread SchemeThread = new Thread(SchemeStart);
            SchemeThread.Start();
        }

        private void SchemeStart()
        {
            if (!Form1.threadFormCreated)
            {
                Form1.threadFormCreated = true;
                Form1 form1 = new Form1();

                form1.Text = "Nested Form";

                form1.ShowDialog();
            }
        }
    }
}


Только будте осторожны со статическим флажком threadFormCreated : если он не поменяет своё значение после старта потока и до создания дочерней формы, то будет довольно весело smile 

Это сообщение отредактировал(а) marcusmae - 5.4.2008, 23:50


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
vponomarov
Дата 5.4.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



Ryan5, а зачем вообще так извращаться?
если в методе одной формы вызвать Show() другой формы, то новая форма будет спокойненько себе висеть на экране, реагировать на события, ожидать реакции пользователя smile 
может я не понял сути проблемы?


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
marcusmae
Дата 5.4.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(vponomarov @  5.4.2008,  23:52 Найти цитируемый пост)
может я не понял сути проблемы?


Ну, суть может быть такой : если одна форма занята, то другая может быть либо тоже недоступна в случае общего потока, либо очень даже доступна в случае раздельных.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ryan5
Дата 6.4.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Ну, ShowDialog это не выход. smile 
Если мне надо будет открыть две формы, то они станут появлятся друг за другом (после закрытия 1 будет вторая), а не обе сразу.
Код

private void SchemeStart()
        {
            Form1 G = new Form1();
            G.ShowDialog();
            Form1 F = new Form1();
            F.ShowDialog();
            
        }

Да и потом, даже если все формы в потоке закрыли, сам поток должен продолжить работу.
Так что нужно что-то другое.

PM MAIL   Вверх
marcusmae
Дата 6.4.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Ryan5 @  6.4.2008,  09:50 Найти цитируемый пост)
Если мне надо будет открыть две формы, то они станут появлятся друг за другом (после закрытия 1 будет вторая), а не обе сразу.


Создайте формы в двух разных потоках так же, как Вы для одной формы делаете, тогда они появятся почти обе сразу. Подойдёт?

Цитата(Ryan5 @  6.4.2008,  09:50 Найти цитируемый пост)
Да и потом, даже если все формы в потоке закрыли, сам поток должен продолжить работу.


Есть масса способов "удерживать" поток в нужном состоянии - циклы, таймеры, барьеры, мониторы, мьютексы  и т.д. Зависит от того, что Вы намерены дальше делать с потоком. Иногда проще просто создать его заново, когда понадобится. Так что опишите задачу, желательно не словами, а блоксхемой.


Это сообщение отредактировал(а) marcusmae - 6.4.2008, 12:37


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ryan5
Дата 6.4.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Цитата(marcusmae @  6.4.2008,  12:31 Найти цитируемый пост)
Есть масса способов "удерживать" поток в нужном состоянии - циклы, таймеры, барьеры, мониторы, мьютексы  и т.д. 


Вот это как раз и нужно, просто если сделать цикл, то тормоза будут. Вот в чём суть:

"Поток что-то сделал" ==> "Поток бездельничает" ==> "При каком-то условии опять что-то начинает делать"

Вся проблема в том что когда поток начинает бездельничать, он завершается и всё что в нём создано пропадает. 
Нужно видимо в потоке что-то умное написать, чтобы он ждал выполнения условия для начала работы, а что написать не знаю.
PM MAIL   Вверх
marcusmae
Дата 6.4.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Ryan5, 

во-первых, если не нужно, чтобы созданное не пропадало, можно хранить на стороне основного потока. То есть, Вы можете заводить переменные в основном потоке, а изменять их в любых других. Только следите за thread-safety : например, элементы форм нельзя изменять вне того потока, в котором они были созданы.

во-вторых - альтернатива во-первых : локальность данных по потокам - это действительно хорошая идея, особенно, если данных очень много, и они текучие. Но для этого нужно знать подробности. Чем займётся поток, после того, как он покончил с формой и подождал? Действует ли он циклически? Кому нужны его данные? = В общем, чем корявее это объяснить, тем хуже будет решение. Предлагаю рисовать.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ryan5
Дата 6.4.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



marcusmae, попробую наверное сделать как вы в первом варианте написали, а то с этими потоками можно голову сломать. Спасибо. smile 
PM MAIL   Вверх
marcusmae
Дата 6.4.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Да больше, наверно, проблема в качественном проектировании Вашей задачи, чем непосредственнно с потоками. Будут вопросы - обращайтесь smile 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.