Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2015, 20:10   #11
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Код:
Про синхронизацию самый простой вариант это например Application.Current.Dispatcher.Invo ke или BeginInvoke. Более красивые варианты — IProgress<T> как по ссылке выше.
Тот код что по выше хз. я там не понял что происходит.

Этот вроде должен блокировать c помощью lock или хз. пример на мсдн увидел тут.

Код:
namespace WpfApplication1
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public 
            int m_count;
            System.Windows.Threading.DispatcherTimer m_timer;

        //создаем объект для блокировки
        private 
            Object m_thisLock = new Object();


        public MainWindow()
        {
            InitializeComponent();
            m_count = 0;
            textBox.Text = "One one one!";
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            //создаем таймер
            m_timer = new System.Windows.Threading.DispatcherTimer();
            m_timer.Tick += new EventHandler(f_timer);
            m_timer.Interval = new TimeSpan(0, 0, 1);//5 секунд
            m_timer.Start();//запускаем таймер
            
            //запускаем поток
            System.Threading.Thread t = new System.Threading.Thread(f_thread);
            t.Start();
            
        }

        //таймер
        private void f_timer(object sender, EventArgs e)
        {
            //обновляем TexBox
            string s = Convert.ToString(m_count, 10);
            textBox.Text = s;  
        }

        //поток
        private void f_thread()
        {
            MessageBox.Show("f-start");
            for(int i=0;i<10000000;i++)
            {
                //делаем задержку
                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1));
                //наверно будет блокировка.
                lock (m_thisLock) {
                    m_count = i;
                }
            //    MessageBox.Show(Convert.ToString(i, 10));  
            }
            m_timer.Stop();//останавливаем таймер
            MessageBox.Show("f-end");
        }
    }
}
И че то еще если в функции потока в цикле без задержки, то цикл не срабатывает. Это что компилятор наверно код оптимизирует
Код:
private void f_thread()
        {
            MessageBox.Show("f-start");
            for(int i=0;i<10000000;i++)
            {
                //делаем задержку
            //    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1));
                //наверно будет блокировка.
                lock (m_thisLock) {
                    m_count = i;
                }
            //    MessageBox.Show(Convert.ToString(i, 10));  
            }
            m_timer.Stop();//останавливаем таймер
            MessageBox.Show("f-end");
        }

И еще Когда приложение закрываю, то поток продолжает работать.
Должно ж вроде закрываем окно и закрывается поток, а он продолжает работать. Как то нада поток закрыть, это не порядок.

Последний раз редактировалось ninja2; 29.09.2015 в 20:12.
ninja2 вне форума Ответить с цитированием
Старый 29.09.2015, 20:20   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Вообще тут изначальная проблема вроде решена, раз доступ к UI только из таймера в UI потоке. Только появилась потенциальная "опасность", что первый поток может прочитать значение когда второй еще не закончил изменять его, или что-то типа того.
Такой счетчик можно сделать без лока с помощью Interlocked.Increment

Цитата:
И еще Когда приложение закрываю, то поток продолжает работать.
Должно ж вроде закрываем окно и закрывается поток, а он продолжает работать.
Свойство IsBackground у экземпляра Thread
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 29.09.2015 в 20:35.
Alex11223 вне форума Ответить с цитированием
Старый 29.09.2015, 21:01   #13
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Цитата:
Свойство IsBackground у экземпляра Thread
Помогло!

Думал через деструктор закрыть, а оно деструктор не вызывается. А можно крестик перегрузить как в MFC, там функцию onCancel перегружаешь, а тут в интерфейсе нету где функции перегружать. Щас поищю.
Код:
~MainWindow()
        {
            MessageBox.Show("!MainWindow");
            m_t.Abort();
        }
Вычитал что можно так сделать
Код:
void MainWindow_Closing(object sender, CancelEventArgs e)
        {
            MessageBox.Show("Closing called");
        }
Пишет ошибку Серьезность Код Описание Проект Файл Строка
Ошибка CS0246 Не удалось найти тип или имя пространства имен "CancelEventArgs" (возможно, отсутствует директива using или ссылка на сборку). WpfApplication1 C:\Users\neo\documents\visual studio 2015\Projects\WpfApplication1\WpfAp plication1\MainWindow.xaml.cs 44


Нужно System. Добавить перед CancelEventArgs

Функция че то не вызвалась..., другую наверно нада

Ниче не помогает, эти функции не вызываеются при закрытии программы или не важно, есть же деструктор?
Код:
 void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            MessageBox.Show("Closing called");
        }

        new public void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            MessageBox.Show("close");
        }

Последний раз редактировалось ninja2; 29.09.2015 в 21:32.
ninja2 вне форума Ответить с цитированием
Старый 29.09.2015, 22:15   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык на событие надо подписаться, а не просто положить функцию и думать, что компилятор как-то сам разберется что это.

Либо в XAML
Код:
Closing="MainWindow_Closing"
либо в коде (конструкторе например)
Код:
Closing += MainWindow_Closing;
Вообще Abort это плохой способ остановки потока (и при завершении программы нет смысла это делать, и так ж убьется все). Надо как-то более культурно просить поток завершиться. Например, просто bool переменную выставлять и в потоке периодически проверять. В Task есть готовый CancellationToken для этого.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 29.09.2015 в 22:23.
Alex11223 вне форума Ответить с цитированием
Старый 29.09.2015, 22:55   #15
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Разобрался.

Создал диалог с кнопками Ок и Отмена
Как сделать кнопку Ок чтобы функция ShowDialog вернула true или вообще определила что я нажал Ок???

Должно true передаваться в showDialog, а у меня при нажатии на кнопку Ok ничего не происходит и диалог не пропадает, вот код кнопок
Код:
<Button Name="OK" Content="Ок"  HorizontalAlignment="Left" Margin="117,202,0,0" VerticalAlignment="Top" Width="75" IsDefault="True"/>
        <Button Name="Cancel" IsCancel="True" Content="Отмена" HorizontalAlignment="Left" Margin="207,202,0,0" VerticalAlignment="Top" Width="75"/>
Вот диалог новый создал с двумя кнопками
Код:
<Window x:Class="WpfApplication1.Dialog2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="Dialog2" Height="300" Width="300">
    <Grid>
        <Button x:Name="button" Content="Ok" HorizontalAlignment="Left" Margin="147,107,0,0" VerticalAlignment="Top" Width="75" IsDefault="True"/>
        <Button x:Name="button1" Content="Cancel" HorizontalAlignment="Left" Margin="190,180,0,0" VerticalAlignment="Top" Width="75" IsCancel="True"/>

    </Grid>
</Window>
Вот код кнопки по которому вызывается диалог
Код:
private void button2_Click(object sender, RoutedEventArgs e)
        {
            Dialog2 dlg = new Dialog2();

            Nullable<bool> res = dlg.ShowDialog();
            if(res== true){ MessageBox.Show("Ok"); }
            else { MessageBox.Show("Cancel"); }
        }
Появляется диалог, нажимаю Ок и диалог не пропадает, почему так?, вроде установлено IsDefault="True" или еще что то добавить нада?

Разобрался, там не так как обычно идентификаторы возвращаются, в WPF или false или true возвращается. Нужно в обработчике изменить DialogResult на true и вызвать Close

Alex11223, Кажись со всеми элементами что нужны разобрался, осталось подключить webbrowser и попробовать сделать бота . Че то WPF больше нравится чем MFC. Щас логику начну делать еще больше понравится 100%, там уже со строками возится не нужно.

Последний раз редактировалось ninja2; 30.09.2015 в 16:36.
ninja2 вне форума Ответить с цитированием
Старый 30.09.2015, 18:37   #16
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

За WebBrowser читаю, немогу в нем ошибку отключить от тут, он какой то не такой чтоли как в visual C++? В Visual C++ там совсем другое было и так же само ошибки выводятся в C# и ИЕ7 подключается.

Добавил ссылку на system.windows.forms и там есть веббраузер, можно его использовать и там совсем другие функции, не такие как в этом.

Там оказывается два веббраузера
web = System.Windows.Forms.WebBrowser(); и
web = new System.Windows.Controls.WebBrowser( );
Они похоже разные по функционалу.

Как сделать чтобы браузер из Winform отображался на диалоге?
в конструктор добавил
Код:
Присоединил WebBrowser из winform

[CSHARP]braws=new System.Windows.Forms.WebBrowser();
braws.Navigate("http://google.ru");
            [/CSHARP]
Как его можно нарисовать на диалоге? Браузер создается, только его не видно.
Что нужно сделать чтобы браузер отобразился?

Последний раз редактировалось ninja2; 30.09.2015 в 20:40.
ninja2 вне форума Ответить с цитированием
Старый 01.10.2015, 02:05   #17
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Цитата:
Надо библиотеку подключить (в References в Solution explorer'е), но вряд ли оно будет работать, читайте дальше.

Работает, только проверил.
System.Windows.Forms.Application.Do Events();
ninja2 вне форума Ответить с цитированием
Старый 03.10.2015, 10:41   #18
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

В C# нету динамических массивов?
Нужно строки записать в массив, а количество строк каждый раз меняется.
ninja2 вне форума Ответить с цитированием
Старый 03.10.2015, 10:58   #19
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

List<string> например.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.10.2015, 11:11   #20
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Я нашел ArrayList, еле разобрался как доступ по индексу делается.
Код:
ArrayList arr = new ArrayList();
            arr.Add("hellow");
            arr.Add(1);
            arr.Add("0.100");

            for(int i=0;i<arr.Count;i++)
            {
                MessageBox.Show(arr[i].ToString());
            }
ninja2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 15:00
Условие обработки сообщений. GPSS JavScr Помощь студентам 0 17.05.2014 23:59
QT - цикл обработки событий. Базиля Помощь студентам 6 25.10.2013 16:54
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10
Функция обработки сообщений VVVadim Win Api 2 08.12.2008 20:46