remove msleep, clean PIConditionVariable, rewrite pipipelinethread, etc...
This commit is contained in:
161
main.cpp
161
main.cpp
@@ -1,123 +1,50 @@
|
||||
#include "pip.h"
|
||||
|
||||
class PIThreadNotifier {
|
||||
public:
|
||||
PIThreadNotifier(): cnt(0) {}
|
||||
|
||||
void wait() {
|
||||
m.lock();
|
||||
while (cnt == 0) v.wait(m);
|
||||
cnt--;
|
||||
m.unlock();
|
||||
}
|
||||
void notifyOnce() {
|
||||
m.lock();
|
||||
cnt++;
|
||||
v.notifyAll();
|
||||
m.unlock();
|
||||
}
|
||||
private:
|
||||
ullong cnt;
|
||||
PIMutex m;
|
||||
PIConditionVariable v;
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
|
||||
PIVector<int> data(10, [](int i)->int{return i;});
|
||||
|
||||
piCout << data;
|
||||
|
||||
PIThreadPoolLoop pool;
|
||||
pool.setFunction([&](int i){
|
||||
data[i] = data[i] + 10;
|
||||
});
|
||||
pool.exec(0, data.size());
|
||||
|
||||
piCout << data;
|
||||
|
||||
return 0;
|
||||
|
||||
PIVector<int> x(20, [](int i) {return i;});
|
||||
piCout << x;
|
||||
piCout << x.any([](int v) {return v == 10;});
|
||||
piCout << x.every([](int v) {return v > 0;});
|
||||
piCout << x.etries([](int v) {return v % 5 == 0;});
|
||||
piCout << x.indexWhere([](int v) {return v % 8 == 0;});
|
||||
piCout << x.indexOf(4, -1);
|
||||
piCout << x.lastIndexOf(1, 0);
|
||||
piCout << x.lastIndexWhere([](int v) {return v % 8 == 0;});
|
||||
PIVector<double> x2 = x.map<double>([](int v) {return v / 10.0;});
|
||||
piCout << x2;
|
||||
piCout << x.reduce<PIString>([](int v, PIString s){return s + PIString::fromNumber(v);});
|
||||
piCout << x.removeWhere([](int v){return v % 2 == 0;});
|
||||
piCout << x.getRange(8, 1);
|
||||
piCout << x.getRange(8, 100);
|
||||
|
||||
piCout << "=====================";
|
||||
|
||||
PIDeque<int> y(20, [](int i) {return i;});
|
||||
piCout << y;
|
||||
piCout << y.any([](int v) {return v == 10;});
|
||||
piCout << y.every([](int v) {return v > 0;});
|
||||
piCout << y.etries([](int v) {return v % 5 == 0;});
|
||||
piCout << y.indexWhere([](int v) {return v % 8 == 0;});
|
||||
piCout << y.indexOf(4, -1);
|
||||
piCout << y.lastIndexOf(1, 0);
|
||||
piCout << y.lastIndexWhere([](int v) {return v % 8 == 0;});
|
||||
PIDeque<double> y2 = y.map<double>([](int v) {return v / 10.0;});
|
||||
piCout << y2;
|
||||
piCout << y.reduce<PIString>([](int v, PIString s){return s + PIString::fromNumber(v);});
|
||||
piCout << y.removeWhere([](int v){return v % 2 == 0;});
|
||||
piCout << y.getRange(8, 1);
|
||||
piCout << y.getRange(8, 100);
|
||||
return 0; // TODO:
|
||||
|
||||
PIByteArray rnd;
|
||||
rnd.resize(1024*1024, 'x');
|
||||
PICLI cli(argc, argv);
|
||||
PITimer tm;
|
||||
cli.addArgument("connect", true);
|
||||
cli.addArgument("name", true);
|
||||
PICloudClient c("127.0.0.1:10101");
|
||||
// c.setReopenEnabled(true);
|
||||
PICloudServer s("127.0.0.1:10101");
|
||||
PIVector<PICloudServer::Client *> clients;
|
||||
CONNECTL(&tm, tickEvent, ([&](void *, int){
|
||||
if (c.isConnected()) {
|
||||
PIString str = "ping";
|
||||
piCout << "[Client] send:" << str;
|
||||
c.write(str.toByteArray());
|
||||
}
|
||||
if (s.isRunning()) {
|
||||
for (auto cl : clients) {
|
||||
if (cl->isOpened()) {
|
||||
PIString str = "ping_S";
|
||||
piCout << "[Server] send to" << cl << ":" << str;
|
||||
cl->write(str.toByteArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
}));
|
||||
CONNECTL(&c, threadedReadEvent, ([&](uchar * readed, int size){
|
||||
PIByteArray ba(readed, size);
|
||||
if (size < 1024) {
|
||||
PIString str = PIString(ba);
|
||||
piCout << "[Client] data:" << str;
|
||||
if (str == "ping_S") c.write(PIString("pong_S").toByteArray());
|
||||
} else piCout << "[Client] blob:" << size;
|
||||
}));
|
||||
CONNECTL(&c, connected, ([](){piCout << "connected";}));
|
||||
CONNECTL(&c, disconnected, ([](){piCout << "disconnected";}));
|
||||
CONNECTL(&s, newConnection, ([&](PICloudServer::Client * cl){
|
||||
piCout << "[Server] new client:" << cl;
|
||||
clients << cl;
|
||||
CONNECTL(cl, threadedReadEvent, ([&c, &s, cl, &rnd](uchar * readed, int size){
|
||||
PIByteArray ba(readed, size);
|
||||
PIString str = PIString(ba);
|
||||
piCout << "[Server] data from" << cl << ":" << str;
|
||||
if (str == "ping") {
|
||||
cl->write(PIString("pong").toByteArray());
|
||||
cl->write(rnd);
|
||||
}
|
||||
}));
|
||||
CONNECTL(cl, closed, ([&clients, cl](){
|
||||
cl->stop();
|
||||
clients.removeAll(cl);
|
||||
cl->deleteLater();
|
||||
}));
|
||||
cl->startThreadedRead();
|
||||
}));
|
||||
if (cli.hasArgument("name")) s.setServerName(cli.argumentValue("name"));
|
||||
if (cli.hasArgument("connect")) {
|
||||
c.setServerName(cli.argumentValue("connect"));
|
||||
c.startThreadedRead();
|
||||
} else {
|
||||
s.startThreadedRead();
|
||||
}
|
||||
tm.start(1000);
|
||||
PIKbdListener ls;
|
||||
ls.enableExitCapture(PIKbdListener::F10);
|
||||
ls.start();
|
||||
WAIT_FOR_EXIT
|
||||
PIThreadNotifier n;
|
||||
int cnt1 = 0;
|
||||
int cnt2 = 0;
|
||||
int cnt3 = 0;
|
||||
PIThread t1([&n, &cnt1](){n.wait(); cnt1++; piMSleep(1);}, true);
|
||||
PIThread t2([&n, &cnt2](){n.wait(); cnt2++; piMSleep(2);}, true);
|
||||
piCout << "created";
|
||||
piMSleep(10);
|
||||
piCout << "unlock" << cnt1 << cnt2 << cnt3;
|
||||
n.notifyOnce(); cnt3++;
|
||||
piMSleep(10);
|
||||
piCout << "unlock" << cnt1 << cnt2 << cnt3;
|
||||
n.notifyOnce(); cnt3++;
|
||||
piMSleep(10);
|
||||
piCout << "run" << cnt1 << cnt2 << cnt3;
|
||||
PIThread t3([&n, &cnt3](){n.notifyOnce(); cnt3++; piMSleep(1);}, true);
|
||||
piMSleep(20);
|
||||
t3.stop();
|
||||
piMSleep(100);
|
||||
piCout << "exit" << cnt1 << cnt2 << cnt3;
|
||||
// m.unlock();
|
||||
// piMSleep(10);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user