Qt рдореЗрдВ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ -
QtConcurrent :: рдореИрдкреНрдб () рдФрд░ рдЙрд╕рдХреЗ рджреЛрд╕реНрддред
рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдкрд░рд┐рдгрд╛рдо QVector рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдореБрдЭреЗ 65 рдорд┐рд▓рд┐рдпрди рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рддреЛ рдореИрдВрдиреЗ рд░реИрдо рдХреЛ рдкреАрдбрд╝рд╛ рдирд╣реАрдВ рджреА, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛, рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдЖрд▓рд╕реА, рдпрд╛рдиреА рдирдП рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗрд╡рд▓ рддрднреА рдХреА рдЬрд╛рдПрдЧреА рдЬрдм рдкреБрд░рд╛рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред
рдХреЛрдб:
bitbucket.org/cblp/threadpoolрд╣реБрдб рдХреЗ рдиреАрдЪреЗ
рдереНрд░реЗрдбрдкреВрд▓ рдХреНрдпреВрдереНрд░реЗрдбрдкреВрд▓ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдереНрд░реЗрдбрдкреВрд▓ :: рдорд╛рдирдЪрд┐рддреНрд░ () рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рджреЗрддрд╛ рд╣реИред
рдЖрдкрдХрд╛ рдлрд╝рдВрдХреНрд╢рди QRunnable рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ M = maxThreadCount рдЯреБрдХрдбрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ (рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ) рдЗрд╕реЗ QThreadPool рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
FutureIterator hasNext () рдФрд░ рдЕрдЧрд▓реЗ () рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдЧрд▓реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, рдпрд╛ рдЕрдЧрд▓реЗ рдкрд░рд┐рдгрд╛рдо рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рддрдХ рдЕрд╡рд░реБрджреНрдз рд╣реЛред рдпрджрд┐ рдПрдо рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ, рддреЛ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг
рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реЗ рддрд╛рд░ рдкрдврд╝реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗ рдирдордХ рдХреЗ рд╕рд╛рде рдПрди-рдЧреБрдирд╛ рдПрдордбреА 5 рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦреЗрдВред (рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдВрд╢реЛрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред)
const uint N = 10000; const QString Salt = "5417"; QByteArray md5_N_times(QString line) { QByteArray data = line.toUtf8(); for ( uint i = 0; i < N; ++i ) data = QCryptographicHash::hash(Salt.toUtf8() + data, QCryptographicHash::Md5); return data; } int main() { QTextStream input(stdin); QTextStream output(stdout); ThreadPool pool; FutureIterator<QByteArray> results = pool.map( QTextStreamIterator(input), md5_N_times ); while ( results.hasNext() ) output << results.next().toHex() << endl; return 0; }
рдпрд╣ рд╕рдм рдЕрднреА рднреА рдмрд╣реБрдд рдирдо рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдкреВрд▓ рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВред рдЖрдк рдЕрдкрдиреЗ рд╕реБрдзрд╛рд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред