Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 14
.NET 4.x

Теряются данные из потока

04.12.2013, 00:37. Показов 878. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, господа форумчане!Уже которую неделю бьюсь головой в стену но никак не могу решить проблему(Как программист я серая посредственность, занимаюсь только потому что попали в руки исходники одного приложения,очень меня заинтересовавшего.До поры до времени получалось отлично дорабатывать и развивать проект, пока не начался твориться полтергейст.При добавлении новых методов,переменных,полей, и даже при изменении внешнего вида mainwindow () после компиляции программа начинала очень неприятно чудить.Судя по поведению пропадает содержимое переменных типа string, point, int и тд, в том числе иногда они не обновляются,то есть в методе присваивается некое значение,а по факту игнорируется. Баги имеют периодический характер.Причём часто начинает глючить в тех участках которые я не затрагивал..Как бы ударился головой,а болит пятка =\.Скоро начну седеть от безуспешных попыток исправить положение( Очень надеюсь на вашу помощь!Если кто то реально поможет готов отблагодарить финансово)

В Thread загружается один из void LazyMiner или IceMiner
Вот запуск цикла и файл с алгоритмом.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public void startButton_Click(object sender, RoutedEventArgs e)
        {
            if (botThread != null)
            {
                stopButton_Click(null, null);
            }
 
 
            if (ApplicationDeployment.IsNetworkDeployed)
            {
                ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
                Title = "StarMonsterBot - " + Settings.Default.character + " " + ad.CurrentVersion;
            }
            else
                Title = "StarMonsterBot - " + Settings.Default.character;
            hwnd = API.FindWindow("treen", "StarConflict - "+ Settings.Default.character);
            if (hwnd.ToInt32() == 0)
            {
                hwnd = API.FindWindow("treen", "StarConflict");
                if (hwnd.ToInt32() == 0)
                 {
                     MessageBox.Show("Cant find StarConflict window");
                 }
 
            }
            Logic.hwnd = hwnd;
            Logic.window = this;
            EmguCVwrapper.hwnd = hwnd;
            API.hwnd = hwnd;
            
            Logic.uiDispatcher = Dispatcher.CurrentDispatcher;
            Logic.LogTextBox = logTextBox;         
            startTimeLabel.Content = DateTime.Now.ToString();
            ThreadStart logic = Logic.LazyMiner;
            if (logicCombobox.SelectedIndex == 0)
                logic = Logic.LazyMiner;
            if (logicCombobox.SelectedIndex == 1)
                logic = Logic.Jetner;
            if (logicCombobox.SelectedIndex == 2)
                logic = Logic.Transport;
            if (logicCombobox.SelectedIndex == 3)
                logic = Logic.Test;
            if (logicCombobox.SelectedIndex == 4)
                logic = Logic.Autopilot;
            if (logicCombobox.SelectedIndex == 5)
                logic = Logic.IceMiner;
 
            if (logic == Logic.LazyMiner)
                VL._logic = "LazyMiner";
            if (logic == Logic.IceMiner)
                VL._logic = "IceMiner";       
            botThread = new Thread(logic); // тут сторюєтсья потік
            botThread.Start();
            botThread.Priority = ThreadPriority.Lowest;
            Settings.Default.launchDrones = 0;
            Settings.Default.armorLost = false;
            VL._firstStart = true;
            dispatcher = new DispatcherTimer(new TimeSpan(0, 0, Settings.Default.checkBotStateDelay), DispatcherPriority.Loaded, delegate
            {
                if (botThread.ThreadState == System.Threading.ThreadState.Stopped)
                {
                    if (Settings.Default.restart)
                    {
                        Settings.Default.restart = false;
                        startButton_Click(sender, e);
                       // startButton_Click(this, new RoutedEventArgs());
                    }
                    botThread.Abort();
                    botThread = new Thread(logic); // тут я його перезапускаю
                    botThread.Start();
                    if (logTextBox.Text.Length > 1000)
                        logTextBox.Text.Remove(logTextBox.Text.Length - 1000);
                    VL._firstStart = false;
                    logTextBox.Text = DateTime.Now.ToString("HH:mm:ss") + " Worked \n" + logTextBox.Text; 
                        GC.Collect();
                    
                }
                
 
            }, Dispatcher);
        }
Вложения
Тип файла: rar Logic.rar (12.9 Кб, 4 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2013, 00:37
Ответы с готовыми решениями:

Теряются сетевые данные в потоке
Товарищи подскажите пожалуйста. Уже голову сломал. С сервера на клиент шлю 5 строчек, вывожу их на клиенте в консоли. Если отправляю...

Не читает данные из потока. TCP
В общем есть сервер который отправляет команду -getio|C:\ клиенту. В клиенте условие: if...

Как получить данные из другого потока?
Здравствуйте. Приложение выполняется в 2 потока. В процессе выполнения необходимо получать данные из другого потока для вывод их в...

6
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
04.12.2013, 03:07
Скинул бы ты проект, можно было бы подумать.

А вообще, там жесть у тебя творится полнейшая. Ты в методе StartButton_Click запускаешь поток, потом создаёшь обработчик для таймера, в обработчике опять обращаешься к потоку. Сам обработчик клика вызывается периодически и каждый раз по новой создаёт обработчик таймера. Короче, я чёт не увидел где ты этот таймер запускаешь. Я бы на твоём месте всё переписал. Разделяй разные действия, а то у тебя какие-то огромные методы , не дублируй код. В таймер можно было бы запихать один метод, что-то там делающий с потоком, как и в сам обработчик клика его же.

Добавлено через 1 минуту
И поток так не завершай. В Task Parallel Library есть поудобнее классы и методы отмены выполнения операции и прочее.

Добавлено через 4 минуты
Запусти у себя этот код, и ты увидишь что творится.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Windows;
using System.Windows.Threading;
 
namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private DispatcherTimer _dispatcherTimer;
        private uint _counter;
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            _dispatcherTimer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Loaded,
                delegate
                {
                    Title = (++_counter).ToString();
                    if (_counter% 4 == 0)
                        Button_Click(sender, e);
 
 
                }, Dispatcher);
            _dispatcherTimer.Start();
        }
    }
}
Ты просто создаёшь много таймеров, которые работают параллельно и постоянно то запускают, то убивают поток, вызывают обработчик клика и создают ещё один обработчик для таймера. Вообще, код не полный, пока вроде бы так всё кажется.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
04.12.2013, 06:26
Цитата Сообщение от CTuJleT Посмотреть сообщение
botThread.Abort();
Жесть...
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 14
04.12.2013, 19:08  [ТС]
Casper-SC,
Если я не ошибаюсь то вы грешите на переполнение стека?В Thread или в приложении?Если в треде то можно попробовать задать через перегрузку класса.А если в приложении то я не знаю как задать размер стека по умолчанию.Но одно скажу.Пока не начинаешь добавлять в проэкт новые классы,методы ,поля и переменные, код ведет себя отлично.Нет проблем со значениями переменых,корректной работы методов и тд.,Да архитектура кода мягко говоря шизофренична и крива,даже я с высоты своих 3 месяцев работы в кодинге это вижу.Считаете проблема рефакторнига?Если да, то как правильно произвести рефакторинг проекта и составить правильную архитектуру?...
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
04.12.2013, 19:21
Цитата Сообщение от CTuJleT Посмотреть сообщение
Если в треде то можно попробовать задать через перегрузку класса
Вообще не понял о чём речь.

Цитата Сообщение от CTuJleT Посмотреть сообщение
А если в приложении то я не знаю как задать размер стека по умолчанию
Никакой размер не надо задавать.

Цитата Сообщение от CTuJleT Посмотреть сообщение
Пока не начинаешь добавлять в проэкт новые классы,методы ,поля и переменные, код ведет себя отлично.
Вот скинь начальный вариант и тот, в который добавил, там посмотрим. Можешь в личку. Поверь, мне твой бот по барабану, не хочешь, дело твоё.

Цитата Сообщение от CTuJleT Посмотреть сообщение
Считаете проблема рефакторнига?Если да, то как правильно произвести рефакторинг проекта и составить правильную архитектуру?...
Я же тебе написал в чём скорее всего проблема, ты просто там какое-то месиво сделал, не так нужно делать. А вообще да, нужно максимально разделить код, чтобы каждая его часть выполняла свою задачу и никак не трогала локальные переменные и т.д., если это возможно, а уже какие-то конкретные методы для конкретных действий пусть уже ворочат локальными переменными, так как и без этого никак. Короче, так сложно объяснить. Чтобы вообще как-то более-менее помочь не плохо было бы у себя запускать и смотреть, что происходит, там уже думать.

Добавлено через 2 минуты
Цитата Сообщение от CTuJleT Посмотреть сообщение
Если я не ошибаюсь то вы грешите на переполнение стека?
Я грешу на то, что у тебя одновременно работает сотня другая таймеров и творит полный ппц с твоей софтиной (убивает, создаёт потоки, которые тоже успевают менять те же переменные, про которые ты писал. Правда я не вижу как ты запускаешь и останавливаешь таймер, поэтому это не 100% так и есть, нужно видеть больше.
1
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 14
04.12.2013, 19:40  [ТС]
Доброго времени суток!Во первых большое спасибо за желание помочь, а во вторых хотел спросить, есть ли возможность привести бота в рабочее состояние?Сейчас занят на работе,как вырвусь на выходной скину проект в личку.Не думайте,я не лентяй халявщик)Просто реально не знаю как справится с этой проблемой...( В долгу не останусь =)
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
04.12.2013, 19:47
Цитата Сообщение от CTuJleT Посмотреть сообщение
есть ли возможность привести бота в рабочее состояние?
Думаю, да. Но, во-первых нужно его тестить запуская у себя на реальной игре. И с другой стороны, нужно понимать, что подразумевается под: "привести бота в рабочее состояние". Если что-то добавить, что пытался ты добавить, но почему-то софтина падала/глючила, то думаю реально. Ок, как скинешь, гляну. Только скинь оба варианта. И начальный, с которого ты начал вообще работать с ним, и тот вариант, что у тебя падает/глючит. То есть 2 проекта (желательно именно так). Ссылку на игру. И скайп, либо любой другой аналог (аська или майл агент, например).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2013, 19:47
Помогаю со студенческими работами здесь

Считать данные потока вывода из другой консоли
Есть приложение, написанное как консоль. Возможно даже не на .NET. Но она делает очень(!) важную для меня операцию. Код примерно следующий:...

Как вывести данные в textbox из другого потока?
Добрый день, как вывести данные, допустим, в textbox из другого потока? TextBox t =...

Не могу достать данные из потока во время выполнения цикла
Доброго времени суток. Проблема вот в чём: есть код формы private void button1_Click(object sender, EventArgs e) { ...

как передавать данные из потока чтения в поток записи
а как передавать данные из потока чтения в поток записи?

Как передать данные из дочерного потока в главный поток
Здравствуйте. Искал по форуму есть похожие темы но нет решения. Есть класс который загружает данные по очереди из определенного адреса в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru