Возможный создать форму на фоновом потоке, затем отобразитесь на потоке UI

ОБНОВЛЕНИЕ: Только для суммирования то, к чему свелся мой вопрос:

Я надеялся, что построение форм.NET и средств управления НЕ создало дескрипторов окна - надеющийся, что процесс был задержан до Формы. Показывать/Формировать. ShowDialog

Кто-либо может подтвердить или отклонить, верно ли это?


Я сделал, чтобы крупный WinForms сформировался с управлением вкладкой, много много средств управления на форме, что паузы при загрузке в течение пары секунд. Я сузил его к сгенерированному коду разработчика в InitializeComponent, а не любую мою логику в конструкторе или OnLoad.

Я хорошо знаю, что не могу пытаться взаимодействовать с UI на любом потоке кроме основного потока UI, но что я хотел бы сделать, должен иметь предварительную нагрузку приложения эта форма (выполните конструктора), в фоновом режиме, таким образом, это готово к дисплею на потоке UI немедленно, как только пользователь хочет открыть его. Однако при построении в фоновом потоке, на этой строке в разработчике:

this.cmbComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;

Я получаю ошибку

Текущий поток должен быть установлен на режим единственной квартиры потока (STA), прежде чем вызовы OLE смогут быть выполнены. Удостоверьтесь, что Вашей Основной функции отметили STAThreadAttribute на нем.

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

Какие-либо идеи?

Править:

Я думаю, что не ясно выражаюсь здесь. Задержка, кажется, происходит во время конструкции огромного количества средств управления во время сгенерированного разработчиками кода.

Моя надежда состояла в том, что весь этот код инициализации произошел, на самом деле не пытаясь коснуться любых реальных объектов окна Win32, так как форму еще на самом деле не показали.

То, что я могу установить (например), Тексты метки и положения от этого фонового потока, дало мне, надеются, что это было верно. Однако это не может быть верно для всех свойств.

12
задан Andy G 18 October 2015 в 13:53
поделиться

4 ответа

Если ваши процентные значения не будут более точными, чем целые процентные значения, используйте генератор случайных чисел для генерации числа 0-99.

Затем в своей функции используйте (программные) кейсы для выбора правильного номера. Например (очистить это):

if 701
  if random_num < 20
    return 1
  else if random number < 50   // ( 20 + 30 )
    return 2
  else if random number < 100  // ( 20 + 30 + 50 )
    return 3
  else
    // error
-121--1858947-

На самом деле проблема заключается в стартовом комплекте emacs с привязкой (set-keyboard-coding-system 'utf-8)

-121--4099535-

Ответ: нет.

Если вы создаете дескриптор окна для любого потока, отличного от потока GUI, вы никогда не сможете его отобразить.

Edit: Полностью возможно создание форм и элементов управления и отображать их в потоке, отличном от основного потока GUI. Конечно, если это позволяет получить доступ только к многопоточному графическому интерфейсу из потока который создал его, но это возможно. - Эшли Хендерсон

Вам нужно выполнить любой тяжелый подъем на bg-нить, а затем загрузить данные в графический графический интерфейс

3
ответ дан 2 December 2019 в 05:54
поделиться

Я думаю, что ваше понимание мало. Органы управления должны быть затронуты из потока, которая создала их, а не основной нитю UI. У вас могут быть многочисленные пользовательские пользователи в приложении, каждый с собственным набором элементов управления. Таким образом, создание элемента управления различным потоком не позволит вам работать с ним из основного потока без маршалки всех вызовов над использованием Invoke или BeginInvoke.

Править Некоторые ссылки на несколько потоков пользовательских интерфейсов:

MSDN на циклах сообщений MSDN Социальная дискуссия Несколько потоков в WPF

4
ответ дан 2 December 2019 в 05:54
поделиться

Ответ на вопросы, которые содержат float и wrap в одном предложении, обычно составляет

overflow: auto

:)

Если вы хотите, чтобы ваша обертка автоматически расширялась по высоте, то должен сделать это.

-121--4538823-

Вероятно, имеется в виду PDF Standard 14 Fonts .

-121--4321234-

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

Даже если вы получаете это на работу, что это вам покупает? Это будет немного медленнее, а не быстрее, в целом.

Может быть, просто показать заставку, пока эта форма загружается?

В качестве альтернативы, просмотрите, почему ваша форма занимает так много времени, чтобы построить в первую очередь. Это не часто занимает секунды.

1
ответ дан 2 December 2019 в 05:54
поделиться

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

-121--2422238-

В то время как невозможно создать форму на одном потоке, и отобразить его, используя другую нить, это , безусловно, возможно создать форму в не основной теме GUI Отказ Текущий принятый ответ, кажется, говорит, что это невозможно.

Формы Windows обеспечивают однопоточную масштабную модель. Таким образом, это означает, что может быть только один контур сообщений о окнах на поток и наоборот. Кроме того, если например, Threta хочет взаимодействовать с петлем сообщения Threadb, он должен маршал вызов через такие механизмы, как BeginInvoke.

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

Итак, чтобы продемонстрировать, Ниже приведен код Windows Forms для создания и отображения формы на нити не графического интерфейса:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        label1.Text = Thread.CurrentThread.ManagedThreadId.ToString();

    }

    private void button1_Click(object sender, EventArgs e)
    {
        ThreadStart ts = new ThreadStart(OpenForm);

        Thread t = new Thread(ts);
        t.IsBackground=false;

        t.Start(); 
    }

    private void OpenForm()
    {
        Form2 f2 = new Form2();

        f2.ShowDialog();
    }
}


public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        label1.Text = Thread.CurrentThread.ManagedThreadId.ToString() ;

    }
}

метод OpenForm работает в новом потоке и создает экземпляр Form2.

Форма2 на самом деле дается собственная отдельная петля сообщений, вызывая ShowDialog (). Если вы должны были позвонить показать () вместо этого, не будет предоставлена ​​цикл сообщений, а Form2 будет закрыться немедленно.

Кроме того, если вы попробуйте доступом к Form1 в OpenForm () (например, использование «Это»), вы получите ошибку выполнения, поскольку вы пытаетесь сделать доступ для перекрестного пользовательского интерфейса.

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

Помимо этих точек, форма2 теперь может использоваться так же, как и любая другая форма. Вы заметите, что Form1 все еще счастливо работает как обычно с собственным сообщением LOPP. Это означает, что вы можете нажать на кнопку и создавать несколько экземпляров Form2, каждый из которых с их собственной отдельной петлем и нитью сообщений.

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

17
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: