
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.128] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
ну это десятки потоковых методов просто может в C# можно и проще. но я не знаю как ![]() Добавлено почему - базовые классы теже должны быть |
![]() |
Сообщ.
#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; } |