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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрытие приложения 
:(
    Опции темы
nerezus
Дата 28.6.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Код

private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            Application.Exit();
        }

нажимаю крестик, мессаджбокс появляется, форма закрввается, но приложение не останавливается.

в параллельном потоке запущен сервер, слушающий сокет.

Как убить приложение без лишних вопросов?


И еще: 
Код

private void onFormLoad(object sender, EventArgs e)
        {
            ThreadedTcpSrvr server = new ThreadedTcpSrvr(true);
        }
 почему нельзя вынести ThreadedTcpSrvr server; из метода и поместить его под
Код

 public partial class Form1 : Form
{

пишет, что нету такого класса.

А этот класс я подключил в виде отдельного файла. Когда он объявлен внутри метода - то все работает.


Дотнет 2. 


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Prehistorik
Дата 28.6.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            Application.Exit();
            thread.Stop();
        }
 
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
Mad
Дата 28.6.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



nerezus, анимательно проверь соответсвия namespace
а лучше выложи полный код (все определения), а то по этим кусочкам можно только догадки строить

Добавлено @ 09:51 
Цитата(Prehistorik @  28.6.2006,  08:25 Найти цитируемый пост)
private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            Application.Exit();
            thread.Stop();
        }

немного не так (Thread.Stop такого просто нет smile )
Код

private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            thread.Abort();
            MessageBox.Show("Preved!");
            Application.Exit();
        }

неплохо еще былобы вставить проверку на текущие состояние (может она уже сама вывалилась smile ), иначе возможны Exception 


--------------------
user posted image
PM MAIL   Вверх
mr.DUDA
Дата 28.6.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Приложение остаётся работать, пока есть хотя бы один поток. Если совсем лениво (или не получается), можно с пом. WinAPI грохнуть процесс - TerminateProcess. 


--------------------
user posted image
PM MAIL WWW   Вверх
nerezus
Дата 28.6.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Код

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


namespace threads
{
 
    public partial class Form1 : Form
    {
        protected ThreadedTcpSrvr server;

        public Form1()
        {
            InitializeComponent();
        }

        private void onFormLoad(object sender, EventArgs e)
        {
            server = new ThreadedTcpSrvr(true);
        }

        private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            server.stopServe();
            Application.Exit();
        }


    }
}



И вот это почти из книжки(добавил ThreadedTcpSrvr(bool newThread), startThreaded(), stopServe())
Код

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace threads
{
    class ThreadedTcpSrvr
    {
        private TcpListener client;
        private bool threaded;
        private Thread mainServer;

        public ThreadedTcpSrvr()
        {
            this.threaded = false;
            this.startServe();
        }

        public ThreadedTcpSrvr(bool newThread)
        {
            if (false == newThread)
            {
                this.threaded = false;
                this.startServe();
            }
            else
            {
                this.threaded = true;
                this.startThreaded();
            }
        }

        private void startThreaded()
        {
            mainServer = new Thread(new
                     ThreadStart(this.startServe));
            mainServer.Start();
        }

        private void startServe()
        {
            client = new TcpListener(9050);
            client.Start();
            Console.WriteLine("Waiting for clients...");
            while (true)
            {
                while (!client.Pending())
                {
                    Thread.Sleep(1000);
                }
                ConnectionThread newconnection = new ConnectionThread();
                newconnection.threadListener = this.client;
                Thread newthread = new Thread(new
                     ThreadStart(newconnection.HandleConnection));
                newthread.Start();
            }
        }

        public void stopServe()
        {
            client.Stop();
            if (this.threaded) this.mainServer.Abort();
        }
    }

    class ConnectionThread
    {
        public TcpListener threadListener;
        private static int connections = 0;
        public void HandleConnection()
        {
            int recv;
            byte[] data = new byte[1024];
            TcpClient client = threadListener.AcceptTcpClient();
            NetworkStream ns = client.GetStream();
            connections++;
            Console.WriteLine("New client accepted: {0} active connections",
                     connections);
            string welcome = "Welcome to my test server";
            data = Encoding.ASCII.GetBytes(welcome);
            ns.Write(data, 0, data.Length);
            while (true)
            {
                data = new byte[1024];
                recv = ns.Read(data, 0, data.Length);
                if (recv == 0)
                    break;

                ns.Write(data, 0, recv);
            }
            ns.Close();
            client.Close();
            connections--;
            Console.WriteLine("Client disconnected: {0} active connections",
                      connections);
        }
    }

}


пытаюсь собрать - оно рутается  
Код

Error    1    Inconsistent accessibility: field type 'threads.ThreadedTcpSrvr' is less accessible than field 'threads.Form1.server'    C:\Мои документы\Visual Studio 2005\Projects\threads\threads\Form1.cs    15    35    threads


смысл этого ругательства я не понял, хотя все слова по отдельности понятны... smile  


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Mad
Дата 28.6.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(nerezus @  28.6.2006,  10:17 Найти цитируемый пост)
Inconsistent accessibility: field type 'threads.ThreadedTcpSrvr' is less accessible than field 'threads.Form1.server'

у тебя переменная определена как protected а класс как private


Цитата(nerezus @  28.6.2006,  10:17 Найти цитируемый пост)
namespace threads
{
    class ThreadedTcpSrvr
    {

замени на 
Код
namespace threads
{
    public class ThreadedTcpSrvr
    {

или

Цитата(nerezus @  28.6.2006,  10:17 Найти цитируемый пост)
    public partial class Form1 : Form
    {
        protected ThreadedTcpSrvr server;

на
Код

   public partial class Form1 : Form
    {
        private ThreadedTcpSrvr server;
 


--------------------
user posted image
PM MAIL   Вверх
nerezus
Дата 28.6.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



спасибо, объявления класса как паблик решило проблему )

но вот эта штука:
Код

public void stopServe()
        {
            client.Stop();
            if (this.threaded) this.mainServer.Abort();
        }

вешает программу.
если убрать client.Stop();, то следующая строчка не дает результатов, хотя условие верно. Продолжает дальше принимать соединения. 


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Mad
Дата 28.6.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



вопервых AcceptTcpClient надо вызывать в слушующем потоке, а не в отдельном
вовторых NetworkStream закрывать ненадо, только TcpClient
и наконец в третьих, еще надо сохранять указатели клиентские потоки, и при закрытии приложения, останавливать их тоже

вообще-то структура многопотокового сервера выглядет намного сложней smile 


--------------------
user posted image
PM MAIL   Вверх
nerezus
Дата 28.6.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Блин, тут на форуме часто джаваскрипт не загружается и кнопок нету, в том числе и "Отправить".

Цитата

опервых AcceptTcpClient надо вызывать в слушующем потоке, а не в отдельном

многопоточность работает )

до этого написал на дотнете калькулятор и мейлсендер, потом забросил...

сейчас хотел поэксперементировать с потоками и сетью, но видать слишком сложно для меня )

кстати, нету готовых классов многопоточных серверов? может я зря мучаюсь?
Например как в питоне есть ThreadedTcpServer(или похожее название), и там надо только метод handle() добавить... 


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Mad
Дата 28.6.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(nerezus @  28.6.2006,  11:30 Найти цитируемый пост)
кстати, нету готовых классов многопоточных серверов

посмотри на www.codeproject.com, там точно было 


--------------------
user posted image
PM MAIL   Вверх
jfx
Дата 28.6.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На codeproject я находил только очень примитивные сервера. Есть реализации нормально сервера в коммерческих компонентах, например IP*Works! от  /n software inc. http://www.nsoftware.com/products/component/ipdaemon.aspx

А я в таком случае просто посылаю всем потокам сигнал что нужно завершаться (просто устанавливаю глобальный булевый флаг). Потаму что не всегда полезно делать Abort, а так посылаю сигнал, потоки доделывают что нужно и завершаются. А в основном потоке после посылки сигнала жду завершения потоков и тогда закрываю приложение.  

Это сообщение отредактировал(а) jfx - 28.6.2006, 15:02
PM MAIL   Вверх
arilou
Дата 28.6.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



А можно просто при создании потока выставить для него свойство IsBackground = true, и тогда этот поток будет грохнут автоматом при Application.Exit(). 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
nerezus
Дата 29.6.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

На codeproject я находил только очень примитивные сервера. 

А коммерческие понятно платные?  smile 

Значит опять не получилось дотнет поучить =( 


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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