Использование потоков в C++

Я перепишу вопрос

У меня есть список (someItems) объектов с числовыми идентификаторами. Я хочу запросить таблицу PurchasedItems в моей базе данных, чтобы получить все строки, где FK_ItemID не не соответствуют идентификатору любого из объектов в моем списке someItems.

Мой ответ:

List<Item> someItems = new List<Item>();
// Populate someItems
List<int> someItemIDs = someItems.Select(i=>i.ID).ToList();
var filtered = ctx.PurchasedItems
                  .Where(x => !someItemIDs.Contains(x.FK_ItemID))
                  .ToList();

Как указано в комментарии @juharr, EF не может работать с коллекцией не примитивных типов, потому что пытается преобразовать это в SQL. Вы можете сначала создать коллекцию someItemIDs.

6
задан Federico A. Ramponi 2 December 2008 в 04:22
поделиться

6 ответов

Я не использовал его сам, но мне говорят, что библиотеки потока Повышения делают его невероятно легким.

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

13
ответ дан 8 December 2019 в 05:58
поделиться

Для Unix/Linux/BSD существует pthread библиотека: учебное руководство.

Я предполагаю, что там эквивалентны в Win32 API.

4
ответ дан 8 December 2019 в 05:58
поделиться

Я использую tbb_thread класс от Intel, распараллеливающего библиотеку стандартных блоков.

3
ответ дан 8 December 2019 в 05:58
поделиться

Можно хотеть считать мою более раннюю регистрацию на ТАК.

(В ретроспективе, что регистрация является немного односторонней к pthreads. Но я - вид Unix/Linux парня. И тот подход казался лучшим относительно исходной темы.)

0
ответ дан 8 December 2019 в 05:58
поделиться

Существуют многие библиотеки потоков, которые совместимы с C++. Так сначала необходимо выбрать тот. Я предпочитаю OpenMP или потоки POSIX (также известный как pthreads). То, как скомпилировать его, зависит от библиотеки, которую Вы имеете, выбирают.

1
ответ дан 8 December 2019 в 05:58
поделиться

Я пользуюсь библиотекой мой университет, который записал профессор. Очень просто реализовать, и работы действительно хорошо (использовал его в течение достаточно долгого времени теперь). Я спрошу его разрешение совместно использовать его с Вами.

Извините за ожидание вперед, но должен проверить :)

++++++ РЕДАКТИРОВАНИЕ +++++++

Хорошо, таким образом, я говорил со своим профессором, и он не возражает, если я совместно использую его здесь. Ниже.h и .cpp файлы для 'Библиотеки RT', записанной Paul Davies

http://www.filefactory.com/file/7efbeb/n/rt_h

http://www.filefactory.com/file/40d9a6/n/rt_cpp

Некоторые точки, которые будут сделаны о потоках и использовании этой библиотеки:

0) Это учебное руководство объяснит создание потока и использование на платформе окон.

1) Потоки в C++ обычно кодируются как часть того же источника (в отличие от процессов, где каждый процесс имеет свой собственный исходный файл, и функционируйте основные ()),

2) Когда процесс в порядке, он может создать другие потоки путем создания соответствующих Вызовов ядра.

3) Несколько потоков работают быстрее, чем несколько процессов, так как они - часть того же процесса, который приводит к меньшему количеству издержек для ОС и уменьшенных требований к памяти.

4) То, что Вы будете использовать в своем случае, является классом CThread в rt библиотеке.

5) (Удостоверьтесь, rt.h и rt.cpp являются частью Вашего 'решения' и удостоверяются, что включали rt.h в Ваш main.cpp),

6) Ниже часть кода от Вашего будущего основного потока (в main.cpp, конечно), где Вы создадите поток с помощью класса CThread.

void main() 
{
    CThread   t1(ChildThread1, ACTIVE, NULL) ;      
    . . . 
    t1.WaitForThread() ;                // if thread already dead, then proceed, otherwise wait

}

Аргументы t1 в порядке: Название функции, действующей как наш поток, состояние потока (это может быть или АКТИВНО или ПРИОСТАНОВЛЕНО - в зависимости от того, что Вы хотите), и в последний раз, указатель на дополнительные данные, можно хотеть передать потоку при создании. После того, как Вы выполните некоторый код, Вы захотите назвать WaitForThread () функцией.

7) Ниже часть кода от Вашего будущего основного потока (в main.cpp, конечно), где Вы опишете то, что делает дочерний поток.

UINT  _ _stdcall  ChildThread1(void *args)      
{

    . . .           
}

Нечетно выглядящей вещью там является подпись потока Microsoft. Я уверен с небольшим количеством исследования, которое можно выяснить, как сделать это в другом OSs. Аргументом являются дополнительные данные, которые могли быть переданы ребенку при создании.

8) Можно найти подробные описания функций членства в rt.cpp файле. Вот сводки:

CThread () - конструктор, ответственный за создание потока

Приостановите () - Приостанавливает дочерний поток, эффективно приостанавливающий его.

Резюме () - Будит приостановленный дочерний поток

SetPriority (международное значение) - Изменения приоритет дочернего потока к значению указан

Сообщение (международное сообщение) - Добавляет сообщение к дочернему потоку

TerminateThread () - Завершает или Уничтожает дочерний поток

WaitForThread () - Приостанавливает родительский поток, пока дочерний поток не завершается. Если дочерний поток уже завершился, родитель не приостановится

9) Ниже пример демонстрационной полной программы. Умная вещь, которую можно сделать, создают несколько инстанцирований единственного потока.

    #include “..\wherever\it\is\rt.h” //notice the windows notation

    int       ThreadNum[8] = {0,1,2,3,4,5,6,7} ;   // an array of thread numbers


    UINT _ _stdcall ChildThread (void *args)    // A thread function 
    {   
        MyThreadNumber = *(int *)(args);    

        for ( int i = 0; i < 100; i ++)
            printf( "I am the Child thread: My thread number is [%d] \n", MyThreadNumber) ;

        return 0 ;
    }
int     main()
{
    CThread     *Threads[8] ;   

// Create 8 instances of the above thread code and let each thread know which number it is.


    for ( int i = 0; i < 8; i ++) {
        printf ("Parent Thread: Creating Child Thread %d in Active State\n", i) ;
        Threads[i] = new CThread (ChildThread, ACTIVE, &ThreadNum[i]) ;
    }

    // wait for threads to terminate, then delete thread objects we created above

    for( i = 0; i < 8; i ++) {
        Threads[i]->WaitForThread() ;
    delete Threads[i] ; // delete the object created by ‘new’
    }
    return 0 ;
}

10) Вот именно! rt библиотека включает набор классов, который позволяет Вам работать с процессами и потоками и другими параллельными методами программирования. Узнайте остальных ;)

1
ответ дан 8 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: