
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.175] |
![]() |
|
Сообщ.
#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 @ не совсем понимаю какие могут быть сложности у класса десатки методов - и что их в отдельный пок все - слишком сложно ![]() |
Сообщ.
#16
,
|
|
|
Цитата archimed7592 @ не совсем понимаю какие могут быть сложности хоть убей... ну это десятки потоковых методов просто может в C# можно и проще. но я не знаю как ![]() Добавлено Цитата archimed7592 @ ну да...только приписочка про compact fw кардинально меняет дело почему - базовые классы теже должны быть |
![]() |
Сообщ.
#17
,
|
|
Цитата zss @ Application.ExitThread methodпочему - базовые классы теже должны быть Цитата msdn в перечисленном compact fw я не нашел...отсюда вывод, что он это не поддерживает...Version Information .NET Framework Supported in: 3.0, 2.0, 1.1, 1.0 Цитата zss @ ну хорошо. какие конкретно сложности? вот ты делаешь sock.Receive или netstream.Read - что изменится, если ты будешь делать это в потоке? приведи конкретный пример...хоть убей, не понимаю...хоть там сотни методов... ну это десятки потоковых методов просто может в C# можно и проще. но я не знаю как |
Сообщ.
#18
,
|
|
|
Цитата archimed7592 @ ну хорошо. какие конкретно сложности? вот ты делаешь sock.Receive или netstream.Read - что изменится, если ты будешь делать это в потоке? приведи конкретный пример...хоть убей, не понимаю...хоть там сотни методов... я понимаю так. У главной формы есть класс, работающий с сокетом. Если его метод создает поток и выполняет это в отдельном потоке, то это никак не отразится на время выполнения метода вцелом. Мне как пользователю по-барабану как этот метод работает внутри. А чтоб это действительно работало в отдельных потоках, то нужно сами методы класса вызывать в отдельном потоке. А это означает что для каждого метода нужет свой потоковый метод - слишком круто будет ![]() |
![]() |
Сообщ.
#19
,
|
|
стоп, стоп, стоп...значит так, вот вычисления:
![]() ![]() void calculate (object wf) { try { for (int i = 1000000; i != 0; --i) { method001 (); method002 (); // ... method099 (); method100 (); } } finally { wf.Invoke (...); // закрываем модальную форму форму } } ![]() ![]() Thread t = new Thread (this.calculate); t.Start (); WaitForm wf = new WaitForm (); wf.ShowModal (); |
Сообщ.
#20
,
|
|
|
archimed7592
ты опять не понял если просто есть класс ![]() ![]() public class BaseClient { bool m1 (Object1 obj1); bool m2 (Object2 obj2); bool m3 (Object3 obj3); ... Object1 m4 (); Object2 m4 (); Object3 m4 (); } их нельзя просто выпольнить в одном потоке. Но это не суть. я набросал тестовый код. попробуй запусти. Заметь. что цикл не выполняется ![]() тоесть его нужно в отдельном потоке. Если удастся корректо запустить форму и убить ее в любом случае, то остальное дело техники ![]() Добавлено а в твоем случае нужно каждый метод в отдельном потоке запускать. Обрабатывать в немже исключения... Да как быть если из метода нужно результат получить. Много вопросов ![]() Прикреплённый файл ![]() |
![]() |
![]() |
|
Цитата zss @ их нельзя просто выпольнить в одном потоке. Но это не суть. я набросал тестовый код. попробуй запусти. Заметь. что цикл не выполняется ![]() ![]() прикрепил. работает как часы. Прикреплённый файл ![]() |
Сообщ.
#22
,
|
|
|
Цитата archimed7592 @ ну не хочешь как хочешь - твой выбор да просто хочется проще сделать ![]() Цитата archimed7592 @ прикрепил. работает как часы. что-то не понятно что прикреплено |
Сообщ.
#23
,
|
|
|
Если хочется форму в отдельном потоке, то сделай её синглтоном, так сразу исчезнет куча проблем
![]() ![]() class WaitForm(){ private static WaitForm wf; private static Thread wt; public static WaitForm(){ (wt=new Thread(new ThreadStart(MessageLoop())).Start(); } private static void MessageLoop(){ wf=new WaifForm(); Application.Run(); } private static int count=0; public static void show(){ if(count++==0) wf.Invoke(new ThreadStart(wf.Show)); } public static void hide(){ if(--count==0) wf.Invoke(new ThreadStart(wf.Hide)); } public static void Init(){}; public staitc void Destroy(){ wf.Invoke(new ThreadStart(wf.Close)); wt.Abort(); } } ...... public static void Main(){ WaitForm.Init(); try{ тут весь код main который был раньше }finally{ WaitForm.Destroy(); } } |
![]() |
Сообщ.
#24
,
|
|
Цитата zss @ то что работает что-то не понятно что прикреплено ![]() |
Сообщ.
#25
,
|
|
|
andrey, а чио изменилось-то
да что-то не совсем я понял код. 1.В конструкторе формы создается поток. который в потоковой функции опять создает форму... 2.Зачем Init, если есть show и hide 3.Да и странный синглетон с открытым конструктором ![]() ![]() ![]() class Form { private static Form m_form = null; private Form() {}; static public Form Object () { if (m_form == null) { m_form = new Form(); } return m_form; } } Добавлено Цитата archimed7592 @ то что работает ...взял кусочек из твоего кода и немного добавил из своего...что там не понятно? а ты сам скачай и посмотри ![]() |
![]() |
Сообщ.
#26
,
|
|
Цитата zss @ скачал, посмотрел, запустил. все работает. по нажатию на button1 вылазят часики, которые идут...где-то через 5 секунд модальная форма закрывается...никаких остаточных эффектов, ничего такого...в принципе работать будет и твой код (из первого поста). твоя проблема в том, что в обработчике FromClose ты вызываешь this.Close...попробуй для обычной формы так сделать - при попытке её закрыть она подвиснет... а ты сам скачай и посмотри |
Сообщ.
#27
,
|
|
|
Цитата archimed7592 @ скачал, посмотрел, запустил. все работает а я запустить не могу ![]() сбрось просто исходники - я сварю |
![]() |
Сообщ.
#28
,
|
|
я просто добавил в твой проект (modal.zip) код из первого поста и немного переработал момент закрытия формы.
![]() ![]() // form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace modal { public partial class Form1 : Form { private Form2 m_form = new Form2(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2.show(); for (int i = 0; i < 100; i++) { System.Threading.Thread.Sleep(50); } Form2.close(); } } } ![]() ![]() //form2.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace modal { public partial class Form2 : Form { private static int index = 0; private static Form2 m_form = null; private static Thread m_thread = null; public Form2() { InitializeComponent(); } private void Form2_FormClosed(object sender, FormClosedEventArgs e) { this.timer1.Enabled = false; } private void Form2_Load(object sender, EventArgs e) { index = 0; timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { label1.Text = "Типа часы: " + (index++ % 4); } public static void show() { ThreadStart start = new ThreadStart(run); m_thread = new Thread(start); m_thread.Start(); //Thread.Sleep(1000 /*2000*/); } /* ------------------------------------------------------------------ */ private delegate void dlg(); public static void close() { m_form.Invoke(new dlg (close_)); m_form.Dispose(); } private static void close_() { m_form.Close(); } /* ------------------------------------------------------------------ */ private static void run() { m_form = new Form2(); Application.Run(m_form); } /* ------------------------------------------------------------------ */ } } |
Сообщ.
#29
,
|
|
|
Цитата archimed7592 @ я просто добавил в твой проект (modal.zip) код из первого поста и немного переработал момент закрытия формы archimed7592, а чем отличается твой код от моего из первого поста только this.Close() замененн на m_form.Close() вщт мой код с этим изменением ![]() ![]() /* -------------------------------------------------------------------------- */ 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 WaitForm_Closed(object sender, EventArgs e) { this.Timer.Enabled = false; } /* ------------------------------------------------------------------ */ private void Close(object sender, EventArgs e) { m_form.Close(); } /* ------------------------------------------------------------------ */ private void Timer_Tick(object sender, EventArgs e) { int count = ClockImages.Images.Count; PictureBox.Image = ClockImages.Images[m_index++ % count]; } /* ------------------------------------------------------------------ */ } } /* -------------------------------------------------------------------------- */ |
![]() |
Сообщ.
#30
,
|
|
Цитата zss @ тем, что, во-первых, я не определяю метода Close, во-вторых, я использую m_form.Close, а не this.Close т. к. это static метод и в нем this нету. ну и, в-третих, покажи свой InitializeComponent (лежит в *.Designer.cs)archimed7592, а чем отличается твой код от моего из первого поста только this.Close() замененн на m_form.Close() Цитата zss @ private WaitForm () { InitializeComponent(); MessageLabel.Text = m_message; } |
Сообщ.
#31
,
|
|
|
Цитата archimed7592 @ тем, что, во-первых, я не определяю метода Close ты боишься что это перекрытие метода ? ну на сколько я понял без override в C# это не прокатит Цитата archimed7592 @ во-вторых, я использую m_form.Close, а не this.Close т. к. это static метод и в нем this нету это резонно ![]() ![]() ![]() А вот close вызывает Close через m_form.Invoke(new EventHandler(m_form.Close)); Цитата archimed7592 @ ну и, в-третих, покажи свой InitializeComponent (лежит в *.Designer.cs) лови ![]() ![]() /* -------------------------------------------------------------------------- */ namespace mcl { partial class WaitForm { /* ------------------------------------------------------------------ */ /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /* ------------------------------------------------------------------ */ /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> /// /* ------------------------------------------------------------------ */ protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } /* ------------------------------------------------------------------ */ #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WaitForm)); this.Timer = new System.Windows.Forms.Timer(); this.Panel = new Labit.Controls.CatPanel(); this.MessageLabel = new Labit.Controls.CatLabel(); this.PictureBox = new Labit.Controls.CatPictureBox(); this.ClockImages = new System.Windows.Forms.ImageList(); this.Panel.SuspendLayout(); this.SuspendLayout(); // // Timer // this.Timer.Interval = 500; this.Timer.Tick += new System.EventHandler(this.Timer_Tick); // // Panel // this.Panel.BackgroundImg = null; this.Panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Panel.Controls.Add(this.MessageLabel); this.Panel.Controls.Add(this.PictureBox); this.Panel.Dock = System.Windows.Forms.DockStyle.Fill; this.Panel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular); this.Panel.ForeColor = System.Drawing.SystemColors.WindowText; this.Panel.Location = new System.Drawing.Point(0, 0); this.Panel.Name = "Panel"; this.Panel.Properties.InactiveBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(217)))), ((int)(((byte)(204)))), ((int)(((byte)(192))))); this.Panel.Properties.InactiveForeColor = System.Drawing.SystemColors.ControlDark; this.Panel.Properties.LookAndFeel.Background.BackgroundStyle = Labit.Controls.BackgroundStyle.Solid; this.Panel.Properties.LookAndFeel.Background.EndColor = System.Drawing.Color.Blue; this.Panel.Properties.LookAndFeel.Background.GradientOrientation = Labit.Controls.Orientation.Vertical; this.Panel.Properties.LookAndFeel.Background.GradientStyle = Labit.Controls.GradientStyle.Normal; this.Panel.Properties.LookAndFeel.Background.StartColor = System.Drawing.Color.White; this.Panel.Properties.LookAndFeel.BorderColor = System.Drawing.SystemColors.ControlDark; this.Panel.Properties.LookAndFeel.BorderStyle = Labit.Controls.BorderStyle.Flat; this.Panel.Properties.LookAndFeel.FrameType = Labit.Controls.FrameType.Raised; this.Panel.Properties.TextAlignment = Labit.Controls.ContentAlignment.MiddleCenter; this.Panel.Size = new System.Drawing.Size(200, 48); this.Panel.TabIndex = 0; this.Panel.Text = ""; // // MessageLabel // this.MessageLabel.BackgroundImg = null; this.MessageLabel.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular); this.MessageLabel.ForeColor = System.Drawing.SystemColors.WindowText; this.MessageLabel.Location = new System.Drawing.Point(42, 13); this.MessageLabel.Name = "MessageLabel"; this.MessageLabel.Properties.AllowFocus = false; this.MessageLabel.Properties.InactiveBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(217)))), ((int)(((byte)(204)))), ((int)(((byte)(192))))); this.MessageLabel.Properties.InactiveForeColor = System.Drawing.SystemColors.ControlDark; this.MessageLabel.Properties.LookAndFeel.Background.BackgroundStyle = Labit.Controls.BackgroundStyle.Solid; this.MessageLabel.Properties.LookAndFeel.Background.EndColor = System.Drawing.Color.Blue; this.MessageLabel.Properties.LookAndFeel.Background.GradientOrientation = Labit.Controls.Orientation.Vertical; this.MessageLabel.Properties.LookAndFeel.Background.GradientStyle = Labit.Controls.GradientStyle.Normal; this.MessageLabel.Properties.LookAndFeel.Background.StartColor = System.Drawing.Color.White; this.MessageLabel.Properties.LookAndFeel.Background.UseParentColor = true; this.MessageLabel.Properties.LookAndFeel.BorderColor = System.Drawing.SystemColors.ControlDark; this.MessageLabel.Properties.LookAndFeel.BorderStyle = Labit.Controls.BorderStyle.NoBorder; this.MessageLabel.Properties.LookAndFeel.FrameType = Labit.Controls.FrameType.Sunken; this.MessageLabel.Properties.TextAlignment = Labit.Controls.ContentAlignment.MiddleCenter; this.MessageLabel.Size = new System.Drawing.Size(148, 20); this.MessageLabel.TabIndex = 6; this.MessageLabel.Text = "Подключение к комплексу..."; // // PictureBox // this.PictureBox.BackgroundImg = null; this.PictureBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular); this.PictureBox.ForeColor = System.Drawing.SystemColors.WindowText; this.PictureBox.Image = ((System.Drawing.Image)(resources.GetObject("PictureBox.Image"))); this.PictureBox.ImageAttribute = Labit.Controls.ImageAttribute.iaBestFit; this.PictureBox.Location = new System.Drawing.Point(5, 7); this.PictureBox.Name = "PictureBox"; this.PictureBox.Properties.AllowFocus = false; this.PictureBox.Properties.InactiveBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); this.PictureBox.Properties.InactiveForeColor = System.Drawing.SystemColors.ControlDark; this.PictureBox.Properties.LookAndFeel.Background.BackgroundStyle = Labit.Controls.BackgroundStyle.Solid; this.PictureBox.Properties.LookAndFeel.Background.EndColor = System.Drawing.Color.Blue; this.PictureBox.Properties.LookAndFeel.Background.GradientOrientation = Labit.Controls.Orientation.Vertical; this.PictureBox.Properties.LookAndFeel.Background.GradientStyle = Labit.Controls.GradientStyle.Normal; this.PictureBox.Properties.LookAndFeel.Background.StartColor = System.Drawing.Color.White; this.PictureBox.Properties.LookAndFeel.Background.UseParentColor = true; this.PictureBox.Properties.LookAndFeel.BorderColor = System.Drawing.SystemColors.ControlDark; this.PictureBox.Properties.LookAndFeel.BorderStyle = Labit.Controls.BorderStyle.NoBorder; this.PictureBox.Properties.LookAndFeel.FrameType = Labit.Controls.FrameType.Sunken; this.PictureBox.Properties.TextAlignment = Labit.Controls.ContentAlignment.MiddleCenter; this.PictureBox.Size = new System.Drawing.Size(33, 32); this.PictureBox.TabIndex = 5; this.PictureBox.Text = ""; // // ClockImages // this.ClockImages.ImageSize = new System.Drawing.Size(128, 128); this.ClockImages.Images.Clear(); this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource")))); this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource1")))); this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource2")))); this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource3")))); // // WaitForm // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.AutoScroll = true; this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(200, 48); this.ControlBox = false; this.Controls.Add(this.Panel); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "WaitForm"; this.Text = "Пожалуйста, подождите..."; this.Closed += new System.EventHandler(this.WaitForm_Closed); this.Load += new System.EventHandler(this.WaitForm_Load); this.Panel.ResumeLayout(false); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Timer Timer; private Labit.Controls.CatPanel Panel; private Labit.Controls.CatLabel MessageLabel; private Labit.Controls.CatPictureBox PictureBox; private System.Windows.Forms.ImageList ClockImages; /* ------------------------------------------------------------------ */ } } |
![]() |
Сообщ.
#32
,
|
|
Цитата zss @ здесь все ок this.Closed += new System.EventHandler(this.WaitForm_Closed); ![]() Цитата zss @ я уверен, что это перекрытие метода... ты боишься что это перекрытие метода ? ну на сколько я понял без override в C# это не прокатит ![]() Цитата zss @ private void Close(object sender, EventArgs e) { m_form.Close(); } ![]() ![]() private void Close(object sender, EventArgs e) { MessageBox.Show ("..."); m_form.Close(); } ![]() |
Сообщ.
#33
,
|
|
|
Цитата archimed7592 @ и увидишь, что он крутиться в рекурсии у них сигнатуры абсолютно разные void Close() и void Close(object sender, EventArgs e) что-то не совсем клеится ![]() Добавлено Цитата archimed7592 @ я уверен, что это перекрытие метода... убеди меня ![]() |
![]() |
Сообщ.
#34
,
|
|
Цитата zss @ согласен...что-то не совсем клеится ну хорошо, у тебя мой modal.zip компилится? просто у меня он помимо этого ещё и работает ![]() |
Сообщ.
#35
,
|
|
|
Цитата archimed7592 @ у хорошо, у тебя мой modal.zip компилится? просто у меня он помимо этого ещё и работает да у меня он тоже работает. есть сомнения с Application.Run(m_form) складываетя впечатление, что в этом случае нет привязки к процесу |
![]() |
Сообщ.
#36
,
|
|
Цитата zss @ Application.Run запускает message loop в текущем потоке... я че-т не пойму, у тебя твой код не работает, а мой работает? ты разницу нашел? есть сомнения с Application.Run(m_form) складываетя впечатление, что в этом случае нет привязки к процесу |
Сообщ.
#37
,
|
|
|
сорри если влез не в тему - в начале поста интересовались почему дочерний процесс пашет при закрытии формы, его породившей...
если вопрос еще актуален то вот - по умолчанию всякий новый процесс создается из свойством IsBackground = false, что и позволяет ему существовать самостоятельно. IsBackground = true спасет отца русской демократии. ПС: както тоже пробовал создавать формы в дочерних потоках - неблагодарная затея ![]() ![]() |
Сообщ.
#38
,
|
|
|
Цитата Fox @ IsBackground = true а это чье свойство ? |
![]() |
Сообщ.
#39
,
|
|
Сообщ.
#40
,
|
|
|
Цитата archimed7592 @ Thread.IsBackground Property а не заблокирует ли при этом порожденный поток родительский ? |
Сообщ.
#41
,
|
|
|
Цитата Thread.IsBackground Property а не заблокирует ли при этом порожденный поток родительский ? Не должен. |
Сообщ.
#42
,
|
|
|
Цитата KotovAlexander @ Не должен. странно, но тогда логично бы было его сделать по-умолчанию не false, а true |
Сообщ.
#43
,
|
|
|
При установке свойства потока Thread.IsBackground = true, создаётся поток-демон. Т. е. поток, который не может существовать без основного процесса. Умирает процесс - умирают все демоны. Естественно это свойство должно быть установлено перед Thread.Start().
![]() ![]() Thread thr = new Thread(new ThreadStart(Run)); thr.IsBackground = true; thr.Start(); |
Сообщ.
#44
,
|
|
|
Цитата SmartX @ Т. е. поток, который не может существовать без основного процесса честно говоря я плохо знаю механизмы C#, но с точки зрения ОС не совсем логично существование потока без процесса (особенно порожденного потока от родительского) |