Новые форумы для: пользователей, администраторов, математиков и филологов.
0
2
using System.IO;
using System.Net;
using System.Text;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Class1
{
    class Program
    {
        private static int Threads = 2;
        private static string FileToRead = "File.txt";
        private static string Target = "admin";

        private static string[] ReadFile = System.IO.File.ReadAllLines(FileToRead);

        private static void StartThreads()
        {
            System.Threading.Thread newThread;
            newThread = new Thread(new ThreadStart(Scanner));
            newThread.Start();
        }

        public static void Scanner()
        {
            foreach (string Line in ReadFile)
            {
                if (Line == Target)
                {
                    Console.Write("" + Line + " == " + Target + "\r\n");
                    Thread.Sleep(5000);
                }
                else if (Line != Target)
                {
                    Console.Write("" + Line + " != " + Target + "\r\n");
                }
            }
        }

        static void Main(string[] args)
        {
            for (int i = 0; i < Threads; i++)
            {
                    StartThreads();
            }
        }
    }
}

Принцип действия код выше.

Заходит строитель на стройку и видит кучу кирпичей берет один кирпич и несет его нормально на склад, пока возвращался подумал а почему бы не взять 2 кирпича двумя руками в каждую по одному подошел к куче и взял 2 кирпича, задумался и сходил 2 раза на склад с кирпичами в руках, взял 4 кирпича 2 в каждую ногу 2 в каждую руку понес и опять задумался и сходит 4 раза на склад, как сделать чтобы строитель брал например по 2 кирпича в каждую руку и нормально относил на склад, затем возвращался еще за 2.

код ищет строку в файле сверяет её с переменной "Target" и выводит на экран.

проблема с потоками если задать потоков 1 все будет нормально, если 2 то код будет обрабатывать одну и туже строку 2 раза если 3 то тоже ... и так далее ...

как решить проблему?)

сколько раз уже задавал вопрос где только не задавал никто толком не ответил если и ответил то не помогло.

задан 23 Фев 1:27

zer0day's gravatar image

zer0day
-1092

изменен 23 Фев 1:32

Быть может вам не отвечают потому, что вам это нафиг не нужно? Чего только стоит пример вашего кода и описание на кирпичах :D

(23 Фев 2:01) AlexWindHope
3

У Вас проблема в том, что каждый поток заново перебирает весь набор строк. Нужно чтобы перебор работал независимо в каждом потоке. Для этого проще всего использоваться перечислитель массива ReadFile. Т.е. до старте потоков делаете var iterator = ReadFile.GetEnumerator() и передаете его в качестве параметра в функцию Scanner (или, чтобы сохранить стиль, объявляете глобально). Внутри функции Scanner вместо foreach последовательно выбираете элементы из итератора. Итератор является совместно используемым ресурсом, поэтому обращение к его методам надо защитить с помощью оператора lock:

string nextString;

while (true) {

    lock (iterator)
    {
        if (!iterator.MoveNext())
            break; //если строки кончились - выходим из цикла
        nextString = iterator.Current;
    }
    doSomethingWith(nextString);
}
ссылка

отвечен 23 Фев 9:17

ganouver's gravatar image

ganouver
1.7k5

чет я не улавливаю разницы с предыдущим ответом.. поясните разницу, пожалуйста - хочется разобраться

(23 Фев 13:02) Дмитрий Ложкин

По сути - никакой. Меньше кода, больше слов. Учитывая заданный вопрос, мне показалось, что приведенного пояснения будет недостаточно.

(23 Фев 15:18) ganouver
2

лочить надо просто. почитайте про lock(){}

и надо не форыч использовать, а енумератор и его лочить и при его помощить коллекцию в потоках перебирать.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread[] threads = new Thread[Environment.ProcessorCount];

            for (int i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(new ThreadStart(startThread));
                threads[i].Start();
            }

        }

        private static string[] bla = new string[] { "", "", "", "", "", "", "", "",     "", "", "", "" };
        private static IEnumerator tmp = bla.GetEnumerator();

        private static  void startThread()
        {
            bool exit;
            do{
                string workstr;
                lock (tmp)
                {
                    if (tmp.MoveNext())
                        workstr = tmp.Current as string;
                    else
                        exit = true;
                }
                // обработка строки
            }while (!exit);
        }
    }
}

примерно так, дальше допилите как надо по этому примеру. надеюсь, помог.. не проверял только - корпаратив был, не до этого :)

ссылка

отвечен 23 Фев 3:07

%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9%20%D0%9B%D0%BE%D0%B6%D0%BA%D0%B8%D0%BD's gravatar image

Дмитрий Ложкин
45539

изменен 23 Фев 3:12

Ваш ответ

Если вы не нашли ответ, задайте вопрос.

Здравствуйте

ХэшКод - это совместно редактируемый форум вопросов и ответов для начинающих и опытных программистов.

Присоединяйтесь!

отмечен:

×1,133
×40
×26
×18
×5

задан
23 Фев 1:27

показан
169 раз

обновлен
23 Фев 15:18

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии