Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449

Как создать отдельный поток ?

02.05.2013, 12:02. Показов 3760. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет
Как вызвать функцию WriteBlockSe в новом потоке, а то форма тормозит.

Заранее спасибо

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
        public void WriteBlockSe(string[,] DataWrite, int Sektors)
        {
            try
            {
                byte[] ByteData = new byte[512];
                int Counter = 0;
                for (int Row = 0; Row < 32; Row++)
                {
                    string Data = "";
                    int PositCow = 0;
                    for (int Cow = 0; Cow < 16; Cow++)
                    {
                        Data = "";
                        int Posit = 0;
                        for (Posit = 0; Posit <= 7; Posit++)
                        {
                            Data = Data + DataWrite[Row, PositCow + Posit];
                        }
                        PositCow = PositCow + Posit;
                        ByteData[Counter] = Convert.ToByte(Convert.ToInt32(Data, 2));
                        Counter++;
                    }
                }
                WritesByte(ByteData, Sektors);
                StatusOpen = "OK WriteBlock";
            }
            catch
            {
                StatusOpen = "Erroe WriteBlock";
            }
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2013, 12:02
Ответы с готовыми решениями:

Как закинуть нужные расчеты в отдельный поток
Вообщем считаю что так и должно быть так как она читает\читает\читает. //все норм и с памятью и с алгоритмом Как сделать что бы...

Как вынести обработчик глобального хука в отдельный поток?
Доброе время суток, уважаемые форумчане! Я делаю глобальный хук, с помощью класса, и хочу вынести обработчик в новый поток но у меня не...

Прокси-сервер: как вывести некоторые операции в отдельный поток
Собственно у меня прокси сервер получает пакет и обрабатывает, но пока он обрабатывает - другие не могут пройти, нужно обработку вынести в...

40
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.05.2013, 12:28
sasha0192, 1. класс Thread
2. вы явно как-то неправильно пишете метод.
3. зачем вы инкрементируете коров во внутреннем цикле?
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 11:22  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
1. класс Thread
Пробовал, не помогает(

Цитата Сообщение от Psilon Посмотреть сообщение
2. вы явно как-то неправильно пишете метод.
Возможно. А как правильно ?

Цитата Сообщение от Psilon Посмотреть сообщение
3. зачем вы инкрементируете коров во внутреннем цикле?
Из string[,] DataWrite собираю 512 байт и записываю в byte[] ByteData


Есть еще варианты ?
Спасибо!
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 12:24
sasha0192, скажите, что подается на вход и что должно быть на выходе
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 13:49  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
скажите, что подается на вход и что должно быть на выходе
На вход string[,] DataWrite, размером 128x256, int Sektors целое число (не так важно)

На выходе вызвать WritesByte(ByteData, Sektors); где ByteData 512 байт, а Sektors = int Sektors
Ну и присвоить StatusOpen = "";
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 14:16
sasha0192, вы не поняли, опишите, как вы преобразовываете двумерный массив строк в одномерный массив байт (тем более, что 128*256 != 512 )
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 15:06  [ТС]
Зада такая - создать графический экран в виде пикселей. Затем массив Бит(пикселей) преобразовать в массив байтов.
Это как раз и делает функция WriteBlockSe(string[,] DataWrite, int Sektors)

Размер экрана 128х256. Построчно (строка одна 128бит - 16 байт) собираю байты, затем полученные байты записываю в массив.

вот в картинках
Миниатюры
Как создать отдельный поток ?  
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 15:10  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
(тем более, что 128*256 != 512 )
Это я таким (наверное тупым) способом представил массив бит.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 15:38
sasha0192, это задание такое тупое или вы просто пытаетесь сохранить картинку?
ТО есть у вас есть строка 10101010 10000111 11010111, это биты, вы хотите их запихнуть в байты, какой-то FF 10 4A ?
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 15:56  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
это задание такое тупое или вы просто пытаетесь сохранить картинку?
Ага - я просто пытаюсь сохранить картинку нарисованную в виде "массива пикселей" (как на картинке)
Почему 512 байт ? все просто, затем уже ранее созданный (записанный) массив байтов нужно сохранить на флешку, размер сектора который 512 байт

Идея в общем - нарисовать картинку и вывести ее на матрицу светодиодную. Вот так
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 17:07
sasha0192, я бы так это делал, не знаю, может поможет чем:
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
using System;
using System.Text;
 
namespace ConsoleApplication41
{
    class Program
    {
        static void Main()
        {
            string s = "1010101010101010101010101010101010101010101010101010101010101010";
            byte[] res = ConvertToByteArray(s);
            foreach (byte b in res)
                Console.WriteLine(b);
            Console.ReadKey();
        }
 
        private static byte[] ConvertToByteArray(string s)
        {
            const int bitsInByte = 8;
            byte[] res = new byte[s.Length / bitsInByte];
            var sb = new StringBuilder(bitsInByte, bitsInByte);
            for (int i = 0, k = 0; i < s.Length;k++)
            {
                for (int j = 0; j < bitsInByte; j++, i++)
                    sb.Append(s[i]);
                res[k] = Convert.ToByte(sb.ToString(), 2);
                sb.Clear();
                sb.Capacity = bitsInByte;
            }
            return res;
        }
    }
}
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 17:13  [ТС]
Ооо работает спасибо а если число строк и столбцов не постоянное ?
Например задается пользователем ?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 17:29
sasha0192, он разобъет все это в одномерный массив. Если хотите, перегоните одномерный в двумерный как хотите. или разобьете строку сабстрингами как-то. Уже ваше дело)
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 17:32  [ТС]
Вот на этом месте начинает тормозить...

C#
1
2
3
4
5
        private static void WritesByte(FileStream WriteRead, byte[] Data, int Posit)
        {
            WriteRead.Position = Posit * 512;
            WriteRead.Write(Data, 0, 512);
        }
Как исправить ?

Здесь как раз идет запись на карточку
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 17:41
sasha0192, а последовтельно нельзя записывать? Флешке конечно почти пофиг но все же. Можно еще асинхронно записывать, если заранее знаете блоки.
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 17:51  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
а последовтельно нельзя записывать? Флешке конечно почти пофиг но все же.
Так последовательно и записываю вот -
C#
1
2
3
4
5
6
7
8
9
10
11
int StatusSektors = 10; // Сколько блоков надо записать 
for (int i = 1; i <= StatusSektors + 1; i++)
{
   WriteBlock(WriteRead, DataWrite1, i);
}
 
private static void WritesByte(FileStream WriteRead, byte[] Data, int Posit)
{
    WriteRead.Position = Posit * 512; // Тут по формуле адрес блока
    WriteRead.Write(Data, 0, 512);
}
Цитата Сообщение от Psilon Посмотреть сообщение
Можно еще асинхронно записывать, если заранее знаете блоки.
Знаю конечно
А как ?

Мне самое главное чтобы форма не зависала и адрес блока (сектора) не пропускала.

А то бывало чтобы записать один сектор приходилось по два раза перезаписывать.
Это видно тут for (int i = 1; i <= StatusSektors + 1; i++)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 18:01
C#
1
Parallel.For(0,10, i => WriteBlock(WriteRead, DataWrite1, i);
форму подвесит, но буедет намного быстрее. Чтобы не подвисало, запускайте в backroungWorker
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 18:29  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Чтобы не подвисало, запускайте в backroungWorker
А как вызвать и передать параметры ?

Вот эти - FileStream WriteRead, byte[] Data, int Posit

Добавлено через 9999999999999999999999999999999999999 минут
проблема как раз в этом)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2013, 21:08
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
using System.ComponentModel;
using System.IO;
using System.Threading.Tasks;
 
namespace ConsoleApplication42
{
    class Program
    {
        static void Main(string[] args)
        {
            //Вместо заглушек пишете то что вам нужно
            const long statusSektors = 10;
            FileStream stream = new FileStream("file.txt", FileMode.Open);
            byte[] data = new byte[100];
 
 
            //Тут основная работа
            var bw = new BackgroundWorker();
            bw.DoWork += (s, e) => Parallel.For(0, statusSektors, i => WriteBlock(stream, data, (int) i));
            bw.RunWorkerAsync();
        }
 
        private static void WriteBlock(FileStream stream, byte[] data, int position)
        {
            stream.Position = position * 512; // Тут по формуле адрес блока
            stream.Write(data, 0, 512);
        }
    }
}
Добавлено через 1 минуту
Можно настроить: действие при завершении копирования, репорт о прогрессе.
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
03.05.2013, 21:26  [ТС]
Класс, уже лучше хоть форму сдвинуть можно Спасибо

Но когда меняешь место положение формы, все же немного дергается
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2013, 21:26
Помогаю со студенческими работами здесь

Как получить доступ к контролу через отдельный поток в кастомном классе?
Ошибка: Невозможно получить доступ к нестатическому члену внешнего типа &quot;Хурда.Form1&quot; через вложенный тип...

Почему не все ядра загружены и, как сделать так, чтобы отдельный поток подавался на отдельное ядро?
Создал 12 потоков, а как-то не все ядра загружены. Процессор i7-3930K. using System; using System.Collections.Generic; using...

Отдельный поток/процесс
Доброго времени суток! Вопрос заключается в следующем: есть COM-порт, с ним ведется работу по прослушиванию: ... настройка...

WebBrowser в отдельный поток
Всем привет! Значит есть флэш игруха на одном сайте, играть нету времени, но хочется обогнать одноклассников :) Написал я прогу которая...

Отдельный поток добавляет данные в DataGridView
Возникла нетривиальная задачка.. Имеется основной поток - приложение с DataGridView. В ходе работы порождается Thread, которой нужно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru