Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.123.61] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Есть форма, которая запускает поток и в потоке отображает изменяющиеся часы часы.
Она отображается, когда например происходят долгие вычисления. /* -------------------------------------------------------------------------- */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Threading; using System.Text; using System.Windows.Forms; /* -------------------------------------------------------------------------- */ namespace mcl { public partial class WaitForm : Form { /* ------------------------------------------------------------------ */ private static int m_index = 0; private static WaitForm m_form = null; private static Thread m_thread = null; private static String m_message; /* ------------------------------------------------------------------ */ private WaitForm () { InitializeComponent(); MessageLabel.Text = m_message; } /* ------------------------------------------------------------------ */ public static void show(String message) { m_index = 0; m_message = message; ThreadStart start = new ThreadStart (run); m_thread = new Thread (start); m_thread.Start(); Thread.Sleep(1000 /*2000*/); } /* ------------------------------------------------------------------ */ public static void close() { m_form.Invoke(new EventHandler(m_form.Close)); m_form.Dispose(); } /* ------------------------------------------------------------------ */ private static void run () { m_form = new WaitForm (); Application.Run(m_form); } /* ------------------------------------------------------------------ */ private void WaitForm_Load(object sender, EventArgs e) { int screenWidth = Screen.PrimaryScreen.Bounds.Width; int screenHeight = Screen.PrimaryScreen.Bounds.Height; int x = (screenWidth - this.ClientSize.Width) / 2; int y = (screenHeight - this.ClientSize.Height) / 2; this.Location = new Point(x, y); this.Timer.Enabled = true; } /* ------------------------------------------------------------------ */ private void Close(object sender, EventArgs e) { this.Timer.Enabled = false; this.Close(); } /* ------------------------------------------------------------------ */ private void Timer_Tick(object sender, EventArgs e) { int count = ClockImages.Images.Count; PictureBox.Image = ClockImages.Images[m_index++ % count]; } /* ------------------------------------------------------------------ */ } } /* -------------------------------------------------------------------------- */ запускается форма так WaitForm.show("Пожалуйста, подождите..."); // здесь вычисления WaitForm.close(); Application.DoEvents(); 1. форма почему-то не работает без Thread.Sleep(1000) - почему 2. если приложение слетает или принудительно закрывается, то основная форма закрывается, а эта иногда нет. Странно - разве процесс не должен почистить все за собой. P.S. или что я не совсем так делаю спасибо |
Сообщ.
#2
,
|
|
|
Цитата zss @ нет, порожденные потоки сами по себе не завершаются. нужно принудительно.Странно - разве процесс не должен почистить все за собой. Цитата zss @ имхо, правильней поток порождать не для формы, а для вычислений WaitForm.show("Пожалуйста, подождите..."); // здесь вычисления WaitForm.close(); Application.DoEvents(); Добавлено Цитата zss @ попробуй сделать Application.DoEvents после show форма почему-то не работает без Thread.Sleep(1000) - почему |
Сообщ.
#3
,
|
|
|
Цитата archimed7592 @ нет, порожденные потоки сами по себе не завершаются. нужно принудительно. а если аварийное завершение - как быть. Ведь это не логично, что потоки, попрожденные процессом не умирают с процессом Цитата archimed7592 @ имхо, правильней поток порождать не для формы, а для вычислений тут не совсем поток, а просто вызов метода, который долго выполняется системой. Выполнять его в потоке слишком накладно и слишком много кода получается. А так вроде один поток для отрисовки формы Или все-таки это не правильно Добавлено Цитата archimed7592 @ попробуй сделать Application.DoEvents после show но если я не ставлю ее после. то она не успевает закрываться и происходит наложение форм |
Сообщ.
#4
,
|
|
|
стоп........... не понял, форма с часиками является модальной, во всяком случае так говориться в заголовке. Тогда не понятно зачем тебе вообще второй поток нужен, ведь при запуске модального окна форма родитель всеравно не доступна. Отсюда следует следующее, перед началом своих вычислений запускаешь свою форму с часиками (тем более что часики с тиками таймера обновляются), а по окончании вычислений закрываешь свои часики. И все!
|
Сообщ.
#5
,
|
|
|
Цитата Pit-Bul @ в коде там она не совсем модальная форма с часиками является модальной, во всяком случае так говориться в заголовке |
Сообщ.
#6
,
|
|
|
Цитата Pit-Bul @ стоп........... не понял, форма с часиками является модальной, во всяком случае так говориться в заголовке ну эмитация модальной. Иначе вычисления не удается проводить Цитата Pit-Bul @ Отсюда следует следующее, перед началом своих вычислений запускаешь свою форму с часиками (тем более что часики с тиками таймера обновляются), а по окончании вычислений закрываешь свои часики. И все! пробовал - почему-то не получилось. может правда не то делал. Можно если не сложно тестовый примерчик |
Сообщ.
#7
,
|
|
|
Цитата zss @ что значит не успевает закрываться?но если я не ставлю ее после. то она не успевает закрываться и происходит наложение форм Цитата zss @ с процессом - умирают...а ты уверен, что процесс умирает? Ведь это не логично, что потоки, попрожденные процессом не умирают с процессом Цитата zss @ что за метод такой? отрисовка формы? тут не совсем поток, а просто вызов метода, который долго выполняется системой. Выполнять его в потоке слишком накладно и слишком много кода получается. А так вроде один поток для отрисовки формы |
Сообщ.
#8
,
|
|
|
Цитата archimed7592 @ что значит не успевает закрываться? например она еще видна, а другая форма котору я показываю накладывается на нее Цитата archimed7592 @ с процессом - умирают...а ты уверен, что процесс умирает? ну думаю что исключение со стеком вызовов и после это... думаю что умирает надежно. в диспетчере процесса точно нет Цитата archimed7592 @ что за метод такой? отрисовка формы? если просто показать форму с часиками, то помимо того что они не меняют свое значение, так еще и текст не виден. Я думаю это из-за того что она создается в контексте первичного потока, который производит вычистение. И ее отрисовка не происходит. Поэтому я создаю ее в отдельном потоке |
Сообщ.
#9
,
|
|
|
Цитата zss @ давай по порядку. в терминах "родительская форма" и "модальная форма", что и когда происходит в таком коденапример она еще видна, а другая форма котору я показываю накладывается на нее WaitForm.show("Пожалуйста, подождите..."); Application.DoEvents(); // здесь вычисления WaitForm.close(); Application.DoEvents(); Добавлено Цитата zss @ не понятно...если в диспетчере процесса нет, то по идее должны умереть все потоки (поток без процесса вроде как не существует) ну думаю что исключение со стеком вызовов и после это... думаю что умирает надежно. в диспетчере процесса точно нет Цитата zss @ ты скажи, что ты делаешь в своих вычислениях. потому что если их можно делать в отдельном потоке, то лучше делать их именно в нем. если нет, то может быть есть более цивильный способ... если просто показать форму с часиками, то помимо того что они не меняют свое значение, так еще и текст не виден. Я думаю это из-за того что она создается в контексте первичного потока, который производит вычистение. И ее отрисовка не происходит. |
Сообщ.
#10
,
|
|
|
Цитата archimed7592 @ давай по порядку. в терминах "родительская форма" и "модальная форма", что и когда происходит в таком коде Цитата archimed7592 @ WaitForm.show("Пожалуйста, подождите..."); Application.DoEvents(); отображение модальной и запуск таймера для изменения часов Цитата archimed7592 @ // здесь вычисления вызов системного метода на долгое время + свои действия (в родительской форме) Цитата archimed7592 @ WaitForm.close(); Application.DoEvents(); закрытие модальной формы |
Сообщ.
#11
,
|
|
|
zss, а в чем тогда проблема? в какой момент происходит наложение? кто на кого накладывается?
|
Сообщ.
#12
,
|
|
|
Цитата archimed7592 @ не понятно...если в диспетчере процесса нет, то по идее должны умереть все потоки (поток без процесса вроде как не существует) а модальные формы существуют - в последний раз 6 штук закрывал Цитата archimed7592 @ ты скажи, что ты делаешь в своих вычислениях. потому что если их можно делать в отдельном потоке, то лучше делать их именно в нем. если нет, то может быть есть более цивильный способ... ну как минимум это передача и получение даннх через Socket - повлиять на это нельзя. И немного своих действий по анализу Добавлено Цитата archimed7592 @ zss, а в чем тогда проблема? в какой момент происходит наложение? кто на кого накладывается? хорошо - попробуйте просто вызвать форму и обновлять в ней что-нибудь при этом производя долгие действия (без потоков и Application.DoEvents). Просто мы наверное не понимаем друг-друга Добавлено P.S. забыл сказать, что это Compact FW 2.0 |
Сообщ.
#13
,
|
|
|
Цитата zss @ а какие сложности работы с сокетом в другом потоке?ну как минимум это передача и получение даннх через Socket - повлиять на это нельзя. И немного своих действий по анализу Цитата zss @ а модальные формы существуют - в последний раз 6 штук закрывал попробуй вместо this.Close(); делать Application.ExitThread (); |
Сообщ.
#14
,
|
|
|
Цитата archimed7592 @ а какие сложности работы с сокетом в другом потоке? у класса десатки методов - и что их в отдельный пок все - слишком сложно Цитата archimed7592 @ попробуй вместо this.Close(); делать Application.ExitThread (); в контексте потока модальной формы ? |
Сообщ.
#15
,
|
|
|
Цитата zss @ ну да...только приписочка про compact fw кардинально меняет дело в контексте потока модальной формы ? Добавлено Цитата zss @ не совсем понимаю какие могут быть сложности хоть убей... у класса десатки методов - и что их в отдельный пок все - слишком сложно |